运行程序后我一直收到错误。 错误是“分段错误(核心转储)”,我得到一个注释。
note: expected ‘const char *’ but argument is of type ‘char’
extern int strcmp (const char *__s1, const char *__s2)
这是我的代码:
int main()
{
char cmdline[100];
printf ("esp> ");
fgets( cmdline, sizeof( cmdline ), stdin );
char *args[4] = { NULL };
char *pchcaus;
pchcaus = strtok (cmdline," ");
int i = 0;
while (pchcaus != NULL)
{
args[i++] = pchcaus;
pchcaus = strtok (NULL, " ");
}
char* command = args[0];
char* argumentOne = args[1];
char* argumentTwo = args[2];
char* input = { "quit" };
printf ("%s", command); // this prints "quit"
if (strcmp(command, input) == 0) { // this is not working. why ?
printf("Bye.\n" );
}
return 0;
}
如果我输入quit,则返回“Segmentation fault(core dumped)”。其他一切都在起作用,但是如果声明的话。比较字符串
的那个答案 0 :(得分:2)
问题的根源有两个:
1)这种初始化不太理想:
char* input = {"quit"};
建议:
char* input = "quit";
2)fgets()
函数输入尾随<newline>
。 <newline>
需要修剪
输入'退出'的实际结果是:
"quit\n"
建议,在致电fgets()
之后插入此内容:
char *NewLine = NULL;
if( NULL != (NewLine = strstr( cmdline, "\n" ) ) )
{
*NewLine = '\0';
}
代码还应检查(!= NULL)来自fgets()
的返回值,以确保输入操作成功
答案 1 :(得分:0)
我认为问题是input
应该定义为char* input[] = { "quit" };
,条件应该是strcmp(command, input[0]) == 0
。
或input
应定义为char* input = "quit";
,条件可以保留为您的示例。
在您的示例中,input
被声明为char**
,但在char*
中用作strcmp
。这在警告......
但是虽然它确实是一个错误,但我无法解释Segmentation fault
错误。这意味着代码尝试读取(或写入)错误的地址(不在用户地址空间中的代码)。但在你的情况下,输入只是指向堆栈上指针的指针(它指向初始化数据段中的一个char数组,其中包含五个字节:&#39; q&#39;,&#39; u&#39; ,&#39;我&#39;,&#39;&#39; \#39; \ 0&#39;)。所以我不得不考虑一下......