读取字符串并比较它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读取的字符串,在大多数情况下,它包括换行符。