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