2013-06-20 52 views
0

編輯:好吧,所以出於某種原因,我認爲scanf行會在整行讀取一個字符串(多個參數)。大腦必須真的被炸。感謝大家的幫助。說,當我把一個項目放在數組的開頭

我想將一些字符放入數組中。這是代碼的外觀。

編輯:添加更多的代碼,希望能夠解決問題 Edit2:我可以像在這個函數中的字符串一樣對待字符指針「消息」嗎?

//in main... 
printf("Enter a command> "); 
scanf("%s", buf); 
message = convertMessage(buf); 
//.... 

char* convertMessage(char *message){ 
    char *convMess = calloc(50, sizeof(char)); 
    char *tok = strtok(message, " ,"); 

    if(convMess == NULL){ 
     perror("memory error"); 
     exit(-5); 
    } 

    if(strcmp(tok, "get") == 0){ 
     tok = strtok(NULL, " ,"); 
     if(strcmp(tok, "lname") == 0){ 
      convMess[0] = '1'; // seg faults on this line 
      convMess[1] = ' '; 
      strcat(convMess, tok); 
      return convMess; 
     } 
     else if(//...   
      //...and so on 
//output from gdb 
Program received signal SIGSEGV, Segmentation fault. 
0x0000000000400e5d in convertMessage (
message=0x7fffffffbfa0 "get") at client.c:135 
135    if(strcmp(tok, "lname") == 0){ 
(gdb) quit 

我知道我可能誤解的東西很簡單,但我一直在這個代碼這麼長時間,我認爲我的腦海裏炸。另外,我已經檢查過在線參考資料,並且cplusplus.com/reference上的代碼看起來與我擁有的相同。

謝謝你的幫助。

+1

您的代碼是:將它傳遞給strcmp(),像這樣的例子之前

tok = strtok(NULL, " ,"); 

精細。也許你應該檢查conMess不是NULL ......但我不認爲問題在那裏。 –

+0

還需要在調用'strcmp'(x2)之前檢查'tok'是否爲NULL。 –

+1

你確定第二次調用'strtok()'沒有返回NULL,並且崩潰在第二次'strcmp()'調用中沒有發生嗎? –

回答

3

你可能會編譯爲64位平臺,而不包括stdlib.h - 如果沒有報關/原型爲calloc()編譯器將截斷返回的指針到int(假設int是32位)。

使用適當的編譯器選項讓編譯器爲這種事情產生警告或錯誤。

+0

我正在編譯3面旗幟,Wall,ansi和迂腐。我也有stdlib.h作爲包含文件。 – user1362058

2

從您發佈我看到了應用程序內存設計缺陷在line135:

if(strcmp(tok, "lname") == 0){ 

大多數propably你逝去的tok,與tokNULL

你可能想擁有它,管線134指派後檢查的tok值對NULL

tok = strtok(NULL, " ,"); 
if (tok != NULL) { 
    if (strcmp(tok, "lname") == 0) { 
    ... 
} 
相關問題