массив строк в с - PullRequest
       2

массив строк в с

2 голосов
/ 07 октября 2010

Как вы используете строковый массив в качестве параметра в C?Если бы я написал функцию с подписью:

Думаю, я не очень хорошо себя объяснил ... Я опубликую код, который пытаюсь заставить работать.

int format_parameters(char* str) {

    char local_str[201] = "";
    int i = 0;
    int j = 0;
    int flip = 0;

    while(str[i]) {

        if((str[i] == '"') && (flip == 0)) flip = 1;//Sentence allowed
        else if((str[i] == '"') && (flip == 1)) flip = 0;//Sentence not allowed

        if(flip == 1) append_char(local_str, str[i]);
        //check if space
        else if(flip == 0) {

            int c = str[i];
            if(!isspace(c)) append_char(local_str, str[i]);

            else {
                if((strlen(local_str) > 0) && (j < 4)) {
                    //local-str copied to param[j] here
                    //printf("j = %d %s\n",j,local_str);

                    local_str[0] = '\0';
                    j++;
                }
            }
        }
        i++;
    }

    //Add \0 to param

    return flip;
}//end format_parameters


void append_char(char* str, char c) {
    int len = strlen(str);
    str[len] = c;
    str[len+1] = '\0';
}//end append_char

int main() {
        char str[200];
        //str filled with stuff...
        int x = format_parameters(str);
}

В подписи format_parameters должен быть второй (и третий?) Параметр, char* param[5], который должен быть читаемым из main.

Ответы [ 4 ]

1 голос
/ 07 октября 2010

Работает ли это?

#include <string.h>
#include <assert.h>
#include <stdio.h>

int format_parameters(char *str, char *param[], size_t nparam)
{
    char **next = param;
    char **end  = param + nparam;
    char  *data = str;

    assert(str != 0 && param != 0 && nparam != 0);

    while (next < end && *data != '\0')
    {
        *next++ = data;
        data = strchr(data, ' ');   // Choose your own splitting criterion
        if (data == 0)
            break;
        *data++ = '\0';
    }
    return(next - param);
 }

 int main(void)
 {
     char  str[] = "a b c d";
     char *param[5];
     int   nvals = format_parameters(str, param, 5);
     int   i;

     for (i = 0; i < nvals; i++)
         printf("Param %d: <<%s>>\n", i+1, param[i]);

     return 0;
  }

Возвращаемым значением является количество найденных параметров.Если вы пропустите пустую строку, это будет 0. Остерегайтесь начальных, конечных и повторяющихся пробелов;код работает - но, возможно, не так, как вы хотите.

0 голосов
/ 07 октября 2010

Вы должны создать массив char * param [] вне функции и просто передать его в качестве параметра:

int paramCount = countParameters(str);  // you have to create this function
char* param[] = malloc(paramCount * sizeof(char*));
format_parameters(str, param);

и внутри функции:

int format_parameters(char* str, char* param[])
{
    int currentParamIndex = 0;

    ..........
        //TODO: check if currentParamIndex < paramCount
        char* currentParam  = str + currentParamStart; // currentParamStart is the start index of the parameter in the str containing all parameters
        param[currentParamIndex] = currentParam;
        currentParamIndex++;
    .............
}

И вДля написания безопасного кода вы должны также передать paramCount в качестве параметра для format_parameters, чтобы функция не получала доступ к элементу за пределами массива.

Или, возможно, вам следует просто использовать getopt

0 голосов
/ 07 октября 2010

Как указал Джонатан, вам нужно больше параметров:

int format_parameters(char* strInput, char* paramOutput[], size_t cbMaxParams );
// return value is actual number of parameter strings in paramOutput

paramOutput - это массив указателей. Поэтому вызывающая сторона должна предоставить массив указателей, а вызываемая функция должна выделить память для строк и установить указатели в массиве:

// main:
#define SIZE 20
char * params[SIZE];

int result = format_parameters( szInput, params, SIZE );
// after use go through params and free all pointers 

// function:
int format_parameters(char* strInput, char* paramOutput[], size_t cbMaxParams )
{
  // ...

  for( size_t i=0; (i<cbMaxParams) && (!noMoreParams); i++ )
  {
     // ... 
     paramOutput[i] = (char *)malloc( xxxx );
     // ...
  }

  // ...
}  
0 голосов
/ 07 октября 2010

Это полностью о распределении памяти.

Если вы выделите статическую память для param до вызова функции, в этой области будет существовать память.

В противном случае посмотрите на динамическое распределение, оно будет существовать до тех пор, пока вы не скажете емууйти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...