2015-04-07 22 views
1

我使用select()來知道我什麼時候必須從stdin讀取。我調用這個函數:如何解析C中的標準輸入?

void 
CLI() 
{ 
    char *line=(char*)malloc(sizeof(char)*32); 
    char *cmd=(char*)malloc(sizeof(char)*16); 
    char *arg1=(char*)malloc(sizeof(char)*8); 
    char *arg2=(char*)malloc(sizeof(char)*8); 

    while(fgets(line, sizeof(line), stdin) != NULL) 
    { 
     cmd=strtok(line," \n\r\t"); 
     arg1=strtok(NULL," \n\r\t"); 
     arg2=strtok(NULL," \n\r\t"); 

     if(cmd==NULL) break; 

     printf("cmd=%s, arg1=%s, arg2=%s",cmd,arg1,arg2); 
    } 
    free(line); 
    free(cmd); 
    free(arg1); 
    free(arg2); 
} 

輸入的例子:#set PAR 0

我能得到什麼:

*** Error in './myprogram': double free or corruption (fasttop): 0x0000000001cc70f0 *** 

我在做什麼錯?

+3

標準警告:請[不要轉換](http://stackoverflow.com/q/605845/2173917)'malloc()'和家族在'C'中的返回值。 –

+0

而不是鑄造它,你必須檢查它不是'NULL'。 –

+2

不要'malloc''cmd','arg1'和'arg2'作爲'strtok'返回'char *'。 –

回答

3

的這裏問題

  1. fgets(line, sizeof(line), stdin,不,這不是你想要的。 sizeof()返回數據類型的大小,而不是指針指向的區域。你必須通過該指針提供的可使用的內存量,像

    while(fgets(line, 32 , stdin) != NULL) //sizeof(char) == 1, can be ommitted

  2. malloc()的指針,使用分配=分配後會導致內存泄漏。使用strcpy()代替複製令牌strtok()返回到所需的指針。

+0

試過用strcpy,但是我得到'segmentation fault'。與malloc一樣沒有。順便說一下,fgets requier行將被初始化。 – anat0lius

+0

@LiLou_你可以使用'gdb'並給我們更多的信息嗎?哪一行出現段錯誤? –

+0

在fgets。我初始化爲NULL。 – anat0lius

1

刪除

char *cmd=(char*)malloc(sizeof(char)*16); 
char *arg1=(char*)malloc(sizeof(char)*8); 
char *arg2=(char*)malloc(sizeof(char)*8); 

爲什麼?由於內存你有malloc ED是丟在這裏:

cmd=strtok(line," \n\r\t"); 
arg1=strtok(NULL," \n\r\t"); 
arg2=strtok(NULL," \n\r\t"); 

strtok返回char*。您更改指針指向的位置。這導致內存泄漏,因爲您沒有free ed分配內存。你不需要

free(cmd); 
free(arg1); 
free(arg2); 

,一旦你已經刪除了三次調用malloc如上所述。另外,Don't cast the result of malloc and family。請注意0​​爲1,因爲它不需要與malloc中的另一個數字相乘。