【问题标题】:it works with gets but not with fgets? [closed]它适用于gets,但不适用于fgets? [关闭]
【发布时间】:2021-06-21 12:10:34
【问题描述】:
#include <stdio.h>
int main(){
    char a[20],b[20];
    int i,c=0,m=0;
    
    fgets(a,20,stdin);
    fgets(b,20,stdin);
    while(a[c]!=0){
        c++;
    }
    for(i=0;i<c;i++)
    { 
        if(a[i]==b[i])
        m=m+1;
    }
    printf("%d",m);      
}

当我使用 fgets 输入时,它不起作用,但如果我使用 get,它会起作用。 在这里,我正在比较字符串的元素并显示相似元素的数量。 例如输入a:1010101 电话:9898101 然后它给出 4 作为输出,但是当我使用 gets 时它给出 3。

【问题讨论】:

  • 请阅读更多 abpout fgets 以及它在缓冲区中存储的内容。
  • 另外请告诉我们“它不起作用”的真正含义。 如何不行吗?对于某些指定的输入,预期和实际输出是多少?您是否尝试过逐句执行代码语句(同时监视变量及其值)以查看实际发生的情况?使用标准的strlen 函数获取字符串长度有什么问题?
  • 请提供更多关于“不起作用”的方式和时间的信息 - 您是否尝试输入超过 20 个字符,所以gets 会破坏您的记忆(可能)但fgets 会限制您的记忆输入?
  • 究竟是什么“不起作用”? fgets 的代码似乎工作正常:printf 'foo\nfoo\n' | ./a.out 按预期打印4。你的输入是什么?你得到什么输出?您的实际输出与您的预期有何不同?
  • fgets() 在输入缓冲区中读取并包含换行符。 gets() 在输入缓冲区中读取但不包含换行符。如果您的输入长度为 18 个或更少的字符(不包括换行符),则两者都应该按照发布的方式工作。如果您的输入正好是 19 个字符长(不包括换行符),fgets() 版本会在第二个fgets() 上读取换行符。如果您的输入是 20 个字符或更多字符,gets() 版本会调用未定义行为。

标签: c c-strings string-comparison fgets trailing-newline


【解决方案1】:

与不安全函数gets(C 标准不支持)相反,如果读取字符的数组有足够的空间,函数fgets 可以在输入的字符串后面附加换行符'\n'。因此,如果通过调用fgets 获得的两个字符串长度相等并且新行字符存储在其中,那么它将计入您的第二个 for 循环。

要从通过调用 fgets 获得的字符串中删除换行符 '\n',您可以使用例如以下方法

#include <string.h>

//...

a[ strcspn( a, "\n" ) ] = '\0';
b[ strcspn( b, "\n" ) ] = '\0';

一般来说你的程序是不正确的,因为用户可以输入不同长度的字符串。

【讨论】:

    猜你喜欢
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多