我要做的是打破用空格作为分隔符的部分中的用户输入,将部分复制到数组(tokenAr
)并比较tokenAr[0]
(第一部分)它等于sHistory
。如果它们相等,则检查tokenAr[1]
的值(如果它是“1”,“2”等),以执行在history
数组中输入的相应命令。这是我尝试过的,它崩溃了。我在Windows x64上使用TCC。
编辑:我忘了提到我两天前开始学习C语言。
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 :(得分: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 };
你在读哪本书?
答案 1 :(得分:0)
在进行标记化时,循环将永远不会结束,因为测试是在变量“结果”上永远不会改变...所以你最终会使用“tokenAr”进入缓冲区溢出...修改代码进行测试“tokenAr”。
编辑:而且tokenAR应该是一个数组......(我不知道它是如何编译的......)
答案 2 :(得分:0)
有很多问题......首先你应该包含string.h,它会在编译中显示一些错误。
我认为主要问题在于:
char tokenAr[2];
result = strtok(sInput, delims);
while (result!=NULL)
{
tokenAr[k] = strtok(NULL, delims);
k++;
}
tokenAr应该是一个指针数组,而不是字符。你确定k永远不会超过2吗?断言有助于调试。