我试图创建一个基于C的字符串菜单,用户输入一个命令,然后运行一段代码。
无论我做什么,条件都不是真的:
char *input= "";
fgets(input, 50, stdin);
printf("%s",input);
printf("%d",strcmp( input,"arrive\0"));
if(strcmp( input,"arrive\0")==0){....
我对c很新,我发现字符串真的很烦人。
我做错了什么?
注意:当前代码崩溃了我的程序:(
答案 0 :(得分:7)
为什么strcmp总是返回非0:
仅当字符串相同时, strcmp
才会返回0。至于为什么它总是评价不同。这是因为fgets在空终止之前将换行符放在输入缓冲区的末尾。
/*Will print 0 if you type in arrive<enter>*/
printf("%d",strcmp( input,"arrive\n"));
为什么程序崩溃:
另一个问题是input
应该是char缓冲区。像这样:char input[1024];
目前,您有input
作为指向空终止字符串(只读内存)的指针
友情提示:
也不要将null终止的\0
放在字符串文字中。使用字符串文字时会自动隐含。就strcmp
而言,将null null终止并不重要,但它可能会在您将来的程序中的其他地方引起问题。人们会想知道你为什么要进行双重无效终止。
答案 1 :(得分:3)
尝试:
#define BUFF_LEN 256
char input[BUFF_LEN];
fgets(input, BUFF_LEN, stdin);
你有什么,*input
是指向尚未分配的内存地址的指针,因此程序无法使用。使用它的结果是未定义的,但通常会导致segmentation fault
。如果要将其作为指针访问,首先需要分配它:
char *input = malloc(BUFF_LEN);
...当然,在完成使用后测试失败(NULL)然后free()它。
编辑:
至少根据single UNIX specification,fgets()保证null终止缓冲区。没有必要初始化输入[]。
正如其他人所说,使用strcmp()时没有必要包含null /换行符。
我也强烈建议你现在习惯使用strncmp()
,同时开始避免许多问题。
答案 2 :(得分:1)
尝试用
替换第一行char input[50];
memset(input, 0, sizeof(input));
编辑: 但是,strcmp为什么不返回0的真正问题是你必须“修剪”从fgets读取的字符串,在大多数情况下,这包括换行符。