2010-05-29 120 views
0

如何比較char **的第一個元素的第一個字母?簡單c問題:比較char數組的第一個字符

我曾嘗試:

int main() 
{ 
    char** command = NULL; 
    while (true) 
    { 
     fgets(line, MAX_COMMAND_LEN, stdin); 
     parse_command(line, command); 
     exec_command(command); 
    } 
} 

void parse_command(char* line, char** command) 
{ 
    int n_args = 0, i = 0; 
    while (line[i] != '\n') 
    { 
     if (isspace(line[i++])) 
      n_args++; 
    } 

    for (i = 0; i < n_args+1; i++) 
     command = (char**) malloc (n_args * sizeof(char*)); 

    i = 0; 
    line = strtok(line," \n"); 
    while (line != NULL) 
    { 
     command[i++] = (char *) malloc ((strlen(line)+1) * sizeof(char)); 
     strcpy(command[i++], line); 
     line = strtok(NULL, " \n"); 
    } 
    command[i] = NULL; 
} 

void exec_command(char** command) 
{ 
    if (command[0][0] == '/') 
      // other stuff 
} 

,但給人的分段錯誤。我究竟做錯了什麼?

謝謝。

+0

您是否將foo創建爲字符串列表?或者就像一個單一的字符串? '* char []'不明智,你的意思是'char * foo []'?你能說明foo是如何聲明的嗎? – Schwern 2010-05-29 21:42:05

+0

您正在尋找的實際類型是什麼?你的意思是一串字符串或什麼?沒有'* char []'這樣的類型。 – Chuck 2010-05-29 21:42:49

+0

已更新的問題。 – nunos 2010-05-29 21:44:39

回答

1

問題是,您確實在parse_command內部分配了一個char *數組,但指向該數組的指針永遠不會退出該函數。所以exec_command得到一個垃圾指針值。原因是,通過調用parse_command(line, command)你可以通過拷貝指針command的當前值,然後在函數內部被覆蓋 - 但是的原始值不受此影響!

爲了實現這一目標,無論你需要傳遞指針要更新的指針,或者您需要將指針從parse_command返回分配的數組。除了char***面色難看(至少對我來說),後一種方法更簡單,更易於閱讀:

int main() 
{ 
    char** command = NULL; 
    while (true) 
    { 
     fgets(line, MAX_COMMAND_LEN, stdin); 
     command = parse_command(line); 
     exec_command(command); 
    } 
} 

char** parse_command(char* line) 
{ 
    char** command = NULL; 
    int n_args = 0, i = 0; 
    while (line[i] != '\n') 
    { 
     if (isspace(line[i++])) 
      n_args++; 
    } 

    command = (char**) malloc ((n_args + 1) * sizeof(char*)); 

    i = 0; 
    line = strtok(line," \n"); 
    while (line != NULL) 
    { 
     command[i] = (char *) malloc ((strlen(line)+1) * sizeof(char)); 
     strcpy(command[i++], line); 
     line = strtok(NULL, " \n"); 
    } 
    command[i] = NULL; 
    return command; 
} 

注:

    在原始 parse_command,你在一個循環中分配內存以 command
  • ,這是不必要的,只會造成內存泄漏。一次分配內存就足夠了。我假設你想command包含n_args + 1指針,所以我相應地修改了代碼。
  • while循環的parse_command,您錯誤地增加了i兩次,這也導致未定義的行爲,即可能的分段錯誤。我在這裏修復它。
+0

你能否提供一些代碼?謝謝。 – nunos 2010-05-29 22:05:49

+0

@nunos,看我的更新。 – 2010-05-29 22:13:48

2

你能粘貼更多的代碼嗎?你是否爲char *數組和char *數組的元素分配了內存?