2013-02-19 79 views
1

我想要做的是以空格作爲分隔符中斷用戶輸入,將部分複製到數組中(tokenAr)並比較tokenAr[0](第一部分)(如果它是等於sHistory。如果相等,則檢查tokenAr[1]的值是否爲「1」,「2」等,以執行在history陣列中輸入的相應命令。這是我試過的,它崩潰了。我在Windows x64上使用TCC。 編輯:我忘了提及,我開始學習C,就在兩天前。從陣列傳遞令牌到strcmp

EDIT2:我在調試器中運行的程序,它已經引起線的Acces Violation(Segmentation Fault)if(strcmp(tokenArPtr[0],sHistory)==0)

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

int main(int argc, char *argv[]) 
{ 
    int i=1; int j=1; int k=0; 
    char history[100][100] = {0}; 
    char sKey[] = "exit"; 
    char sInput[100]; 
    char sHistory[]="history"; 

    do 
    { 
     //gather user input 
     printf ("hshell> "); 
     fgets (sInput, 100, stdin); 
     strcpy(history[i],sInput); 
     i++; 
     //END_gather user input 

     //Tokenizing 

     char delims[] = " "; 
     char *tokenArPtr[5]; 
     char *result = NULL; 

     result = strtok(sInput, delims); 
     tokenArPtr[0] = result; 

     while (result!=NULL) 
     { 
       puts(result); 
       result= strtok(NULL, delims); 
       tokenArPtr[k+1] = result; 

       puts(tokenArPtr[k]); 
       puts("====="); 
       k++; 
     } 
     k=0; 
     /* 
     //END_Tokenizing 

     if(strcmp(tokenArPtr[0],sHistory)==0) 
     { 
      for(j=1;j<i;j++) 
      { 
       printf("%d. %s \n",j,history[j]); 
      } 
     } 

     else if (strcmp (sKey,tokenArPtr[0]) != 0) 
     { 
      printf("\nCommand not found \n"); 
     }*/ 
    }while (strcmp (sKey,sInput) != 0); 
    return 0; 
} 

編輯3:我直接使用result變量代替tokenArPtr,但是當調試,我注意到數組的值沒有被更新。

+0

你有沒有試過在調試器中運行它? – 2013-02-19 09:04:40

+0

@JoachimPileborg @hmjd在離開while循環後應該設置'k = 0'嗎? (就在end_tokenizing評論之前) – serge 2013-02-19 09:09:52

回答

0

strtok返回哪種類型? char *。 tokenAr [k]的類型是什麼? char。 strcmp期望什麼類型的輸入? char *char *。 tokenAr [0]的類型是什麼? char

查看問題?你應該。 *非常重要。

假設tokenAr被聲明爲char *tokenAr[2];,tokenAr存儲多少個char *值?當k超過2時會發生什麼?你需要確保你不會溢出你的tokenAr數組。

history未初始化。使用未初始化的變量是未定義的行爲。我建議初始化它,如下所示:char history[100][100] = { 0 };

您正在閱讀哪本書?

+0

根據您的建議編輯代碼。爲了簡單起見,我們說它永遠不會超過兩個。仍然崩潰。我正在讀Head First C. – serge 2013-02-19 09:21:26

+0

由於tokenArPtr [k]未初始化,所以'k ++'後面緊接着測試'tokenArPtr [k]!= NULL'是未定義的行爲。我預計會崩潰。考慮:for(k = 0; k Sebivor 2013-02-19 14:44:16

+0

我將使用最近發生的不會崩潰的更改編輯代碼,但正如您將看到的,我無法更新數組值。更新的代碼。 – serge 2013-02-19 15:12:32

0

雖然令牌化,循環將永遠不會結束,因爲測試是在變量「結果」,永遠不會改變......所以,你終於要用「tokenAr」緩衝區溢出...將你的代碼修改爲測試「tokenAr」。

編輯:而且tokenAR應該是一個數組...(我不知道它是如何可以編譯...)

+0

做到了,但依然如此。編輯了代碼 – serge 2013-02-19 09:24:00

0

有很多問題...首先你應該包括哪些文件string.h會在編譯時顯示一些錯誤。

我認爲,主要問題是在這裏:

char tokenAr[2]; 
     result = strtok(sInput, delims); 
     while (result!=NULL) 
     { 
       tokenAr[k] = strtok(NULL, delims); 
       k++; 
     } 

tokenAr應該是指針,而不是字符數組。你確定k不會超過2嗎?斷言將有助於調試。

+0

。請檢查一下。 – serge 2013-02-19 09:22:41

+0

你沒有刪除錯誤...你仍然檢查一個常數值...你必須檢查最後寫入的指針 – cedrou 2013-02-19 09:26:56

+0

while(tokenAr [0]!= NULL)???條件應該取決於k – 2013-02-19 09:28:45