我已经绞尽脑汁想了一个小时了。
这是一个简单的检查字符串是否是回文。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define LEN 20
int main()
{
char word[LEN], drow[LEN];
printf("Insert a word: ");
fgets(word, LEN + 1, stdin);
strcpy(drow, word);
strrev(word);
if(strcmp(drow,word) == 0){
printf("The string is a palindrome\n");
}
else{
printf("The string isn't a palindrome\n");
}
return 0;
}
这段代码不起作用,这是输出(还有一些调试代码来显示发生了什么)
(This是实现了调试代码的版本)
char word[LEN], drow[LEN];
printf("Insert a string: ");
fgets(word, LEN + 1, stdin);
strcpy(drow, word);
strrev(word);
puts(word);
puts(drow);
printf("strcmp=%d\n", strcmp(drow, word));
if(strcmp(drow,word) == 0){
printf("The string is a palindrome\n");
}
else{
printf("The string isn't a palindrome\n");
}
return 0;
Insert a word: tacocat
tacocat //this is the "word" string
tacocat //this is the "drow" string
strcmp=1 //the return of strcmp
The string isn't a palindrome
Process returned 0 (0x0) execution time : 4.589 s
但是,当第11行的fgets()
被gets(word)
替换时,会发生以下情况
Insert a word: tacocat
tacocat
tacocat
strcmp=0
The string is a palindrome
Process returned 0 (0x0) execution time : 3.897 s
我不明白为什么gets()
可以工作,而fgets()
不行。
我已经尝试用sizeof替换字符串的最大长度,但仍然不行。
2条答案
按热度按时间iszxjhcz1#
fgets()
不会去掉作为输入的一部分的换行符(您必须在输入提示符处按'Enter')。这在调试输出中很明显,因为出现了额外的空白行。
而不是通过添加代码进行调试(编写代码来查找您编写的代码中的错误-这可能会出什么问题;- )),我强烈建议你使用调试器。在调试器中检查这些字符串数组会使问题变得相当明显。此外,你可能已经注意到
gets()
和fgets()
在各自的文档中的不同语义。ndh0cuux2#
如果输入缓冲区有空间,
fgets
也会读取换行符。而gets
没有。但是gets
已经从C标准中删除了(从C11开始)。所以使用它不是一个选择(它从来都不是由于其固有的安全缺陷)。因此,使用
fgets
,但删除换行符: