读取字符串并比较它C.

时间:2010-04-05 00:19:19

标签: c string

我试图创建一个基于C的字符串菜单,用户输入一个命令,然后运行一段代码。

无论我做什么,条件都不是真的:

char *input= "";
fgets(input, 50, stdin);
printf("%s",input);
printf("%d",strcmp( input,"arrive\0"));
if(strcmp( input,"arrive\0")==0){....

我对c很新,我发现字符串真的很烦人。

我做错了什么?

注意:当前代码崩溃了我的程序:(

3 个答案:

答案 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读取的字符串,在大多数情况下,这包括换行符。