C语言 为什么gets在这种情况下可以工作,而fgets不能?

6yjfywim  于 2023-04-19  发布在  其他
关注(0)|答案(2)|浏览(156)

我已经绞尽脑汁想了一个小时了。
这是一个简单的检查字符串是否是回文。

#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替换字符串的最大长度,但仍然不行。

iszxjhcz

iszxjhcz1#

fgets()不会去掉作为输入的一部分的换行符(您必须在输入提示符处按'Enter')。
这在调试输出中很明显,因为出现了额外的空白行。
而不是通过添加代码进行调试(编写代码来查找您编写的代码中的错误-这可能会出什么问题;- )),我强烈建议你使用调试器。在调试器中检查这些字符串数组会使问题变得相当明显。此外,你可能已经注意到gets()fgets()在各自的文档中的不同语义。

ndh0cuux

ndh0cuux2#

如果输入缓冲区有空间,fgets也会读取换行符。而gets没有。但是gets已经从C标准中删除了(从C11开始)。所以使用它不是一个选择(它从来都不是由于其固有的安全缺陷)。
因此,使用fgets,但删除换行符:

if (fgets(word, sizeof word, stdin)) {
    char *p = strchr(word, '\n');
    if (p) *p = '\0'; // Remove newline if present
} else {
    /* handle error */
}

相关问题