2010-10-07 30 views
2

如何在C中使用字符串數組作爲參數?如果我要寫一個帶簽名的函數: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可讀。

+0

您需要知道數組中有多少個插槽作爲'param'傳遞;這需要函數的額外參數。 – 2010-10-07 07:10:00

回答

1

這是行不通的嗎?

#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

@schot:如果輸入字符串不可修改,它將有一個'const char *'類型。 – 2010-10-07 07:30:05

+0

+1這種方法效果很好。 – schot 2010-10-07 07:34:25

+0

我認爲ypu're在做他的功課。 – Matt 2010-10-07 08:04:43

0

這完全是關於內存分配。

如果在調用函數之前爲param分配靜態內存,則內存將存在於該範圍內。

否則看看動態分配,它會存在,直到你告訴它離開。

0

由於Jonatahan指出的那樣,你需要更多的參數:

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

您必須創建函數外部的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