我已經到達了程序的最後部分,並且我再次遇到了一些問題。使用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;
}
側欄:*從不*使用'gets()'。這是如此糟糕,它已被棄用的C99,甚至沒有出現在C11。這很糟糕。改用''fgets()'](http://en.cppreference.com/w/c/io/fgets)替代'stdin'。 – WhozCraig 2013-02-20 07:18:53
我有'fgets',但是我的程序沒有做任何事情,沒有退出,沒有數組拷貝。這就是爲什麼我使用'gets()',我輸入的所有內容都會導致「未找到命令」。有關於此的任何想法? – serge 2013-02-20 07:21:09
這確實很奇怪。我假設你使用了'stdin'併爲你的輸入緩衝區提供了適當的長度。如果是這種情況,代碼中還有另一個問題。我現在正在看它。那是吸引我眼球的第一件事。 – WhozCraig 2013-02-20 07:24:52