2013-02-20 27 views
0

我已經到達了程序的最後部分,並且我再次遇到了一些問題。使用strcmp和嵌套循環檢查數組的值


問題1:當我在標記化的while循環中打印數組的分隔字符串部分時,值是可以的。但是,當我打印puts(tokenArray[1])時,結果只顯示了一個字母,例如:Input:「qwerty」|打印輸出while循環:qwe rty |在循環之外使用puts(tokenArray[1])進行打印輸出:「e」(是的,只是字母)。


問題2:我在調試時注意到了這一點。輸入隨機輸入後輸入「歷史記錄」後,tokenArray的第一個位置填充「歷史記錄」,下一個位置填入「tory」。爲此,我不能使用嵌套循環和strcmp,如下所示,以檢查第一部分是否爲「歷史記錄」,如果是,請檢查第二部分。如果第二部分是空的,只顯示命令的歷史記錄,或者如果它是「1」/「2」等(當用戶輸入「歷史1」時,執行歷史中的第一個命令)

是我迄今取得的進展:。

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

int main (int argc, char *argv[]) 
{ 
    int i=0; int j=0; int k=0; 
    char inputString[100]; 
    char *result=NULL; 
    //char *result2=NULL; 
    char delims[] = " "; 
    char historyArray[100][100] = {0}; 
    char historyKey[] = "history"; 
    char *tokenArray[100] = {0} ; 
    //char exitString[] = "exit"; 

    do 
    { 
     printf("hshell>"); 
     gets(inputString); 
     strcpy (historyArray[k], inputString); 
     k++; 

     // Break the string into parts 
     result = strtok(inputString, delims); 


     while (result!=NULL) 
     { 
      //result2 = result; 
      tokenArray[j] = result; 
      //puts(result); 
      result= strtok(NULL, delims); 
      //puts(tokenArray[j]); 
      j++; 
     } 
     //j = 0; 
     puts(tokenArray[1]); 
     if (strcmp(tokenArray[0],historyKey) == 0) 
     { 
      if (strcmp(tokenArray[1], " ") == 0) 
      { 
       for (i=0; i<k; i++) 
       { 
        printf("%d. %s \n",i+1,historyArray[i]); 
       } 
      } 
     } 
     else if (strcmp ("exit",inputString) != 0) 
     { 
      printf("\nCommand not found \n"); 
     } 

    } while (strcmp ("exit", inputString) != 0); 
    return 0; 
} 
+1

側欄:*從不*使用'gets()'。這是如此糟糕,它已被棄用的C99,甚至沒有出現在C11。這很糟糕。改用''fgets()'](http://en.cppreference.com/w/c/io/fgets)替代'stdin'。 – WhozCraig 2013-02-20 07:18:53

+0

我有'fgets',但是我的程序沒有做任何事情,沒有退出,沒有數組拷貝。這就是爲什麼我使用'gets()',我輸入的所有內容都會導致「未找到命令」。有關於此的任何想法? – serge 2013-02-20 07:21:09

+0

這確實很奇怪。我假設你使用了'stdin'併爲你的輸入緩衝區提供了適當的長度。如果是這種情況,代碼中還有另一個問題。我現在正在看它。那是吸引我眼球的第一件事。 – WhozCraig 2013-02-20 07:24:52

回答

1

幾件事情立刻顯現

  1. 你永遠從一個命令行中的復位j值到下一個
  2. strtok()不會釘一個單一的sp ace字符串輸入您的輸入令牌,只是因爲您輸入了類似「command」的內容。它會剝去分隔符,所以你的邏輯與這個想法是有缺陷的。 「命令」的輸入標記將是一個單一的標記,對於「命令一」它將是「命令」和「一個」。你顯然認爲它會給你一個單一空間的字符串,與你在做什麼strcmp(tokenArray[1], " ")
  3. 大,但是並不會立即解決問題,最終你會溢出你的籌碼時k變得足夠大(100個指令要準確)
  4. 榮譽給@unwind,你需要拋出了新行獲取與fgets(),這我在測試時做過。 Prolly應該提到這一點。

修復第一個問題,重新考慮第二個問題,並考慮一個替代結構來保存第三個歷史。最後,我用fgets(inputString, 100, stdin);進行了測試,結果確實有效,所以不知道你在那邊有什麼問題。

+0

我想我有#1。由於某種原因,我不記得有人評論說過。我認爲這部分問題的方法是這樣的:把輸入(「歷史1」)分成幾部分。將第一部分插入'tokenArray [j]'中,將第二部分插入'tokenArray [j + 1]'中。然後檢查:如果第一個是「歷史記錄」,請檢查第一個是否爲空。如果這不正確? – serge 2013-02-20 07:49:27

+0

@ voth1234我是這樣做的,我會將令牌拆分作爲歷史記錄保留在結構中,並且一次對輸入行進行並行解析。 – WhozCraig 2013-02-20 07:52:39

+0

這似乎是一個更合乎邏輯的方法。我會嘗試。謝謝。編輯:你如何扔掉換行符? – serge 2013-02-20 07:58:15