Я добрался до финальной части программы и снова столкнулся с некоторыми проблемами.
Проблема № 1: Когда я печатаю отдельные строковые части массива в цикле токенизации, значения в порядке. НО, когда я печатаю puts(tokenArray[1])
, отображается только одна буква команды, например: Input: "qwe rty" | Распечатка в цикле while
: qwe rty | Распечатка с использованием puts(tokenArray[1])
вне цикла: "e" (да, просто буква).
Проблема № 2: я заметил это во время отладки. После того, как я ввожу случайный ввод, а затем ввожу «историю», tokenArray
первая позиция заполнена «историей», а следующая позиция заполнена «историей». Для этого я не могу использовать вложенный цикл и 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()
сstdin
. - person WhozCraig   schedule 20.02.2013fgets
, но тогда моя программа ничего не делала, ни выхода, ни копирования массива. вот почему я использовалgets()
, все, что я печатал, приводило к тому, что команда не найдена. Любые идеи по этому поводу? - person serge   schedule 20.02.2013stdin
и указали соответствующую длину для вашего входного буфера. В коде есть еще одна проблема, если это так. Я просматриваю это прямо сейчас. это было первое, что бросилось в глаза. - person WhozCraig   schedule 20.02.2013fgets(inputString, 100, stdin);
. Спасибо - person serge   schedule 20.02.2013fgets()
заключается в том, что он сохраняет перевод строки в конце строки, аgets()
— нет. Обычно он вам не нужен, поэтому вам нужно либо игнорировать его при сравнении, либо сначала найти его и удалить. - person unwind   schedule 20.02.2013