【问题标题】:How to remove extra characters input from fgets in C?如何从 C 中的 fgets 中删除额外的字符输入?
【发布时间】:2015-08-03 23:15:23
【问题描述】:

我听说使用gets() 在C 编程中不好,使用fgets 更安全...所以我使用fgets。但是,我在使用 fgets 时遇到了一个问题:我输入了太多字符,不知何故,它溢出了。

如何去掉多余的输入字符?

char answer[4];
char answer2[4];

fgets(answer,sizeof(answer),stdin);
printf("answer: %s\n",answer);

fgets(answer2,sizeof(answer2),stdin);
printf("answer2: %s\n",answer2);

例如对于第一个fgets,我输入123456,我得到的输出是

answer: 123
answer2: 456

如何从进入下一个 fgets 输入中删除 456?在为第一个 fgets 输入 123456 后,我想要这样的输出:

answer: 123

然后,用户继续为下一个 fgets 输入输入...

【问题讨论】:

    标签: c input output overflow fgets


    【解决方案1】:
    fgets(answer,sizeof(answer),stdin);
    printf("answer: %s\n",answer);
    if(!strchr(answer, '\n'))     //newline does not exist
        while(fgetc(stdin)!='\n');//discard until newline
    fgets(answer2,sizeof(answer2),stdin);
    

    【讨论】:

    • 非常感谢!在网上研究像你这样的答案并不容易。再次感谢您:) 我喜欢它。它简短易懂。
    • 很好的实现。问题:当我发出CTRL+D 序列而不是在输入序列末尾点击ENTER 时,它是如何工作的?据我了解,如果输入为This is a test ^D^D,则输入序列中不应该有换行符,但是这段代码仍然可以正常工作,就好像我最后点击了ENTER
    【解决方案2】:

    您可能还对 getline() 感兴趣。

    #include <stdio.h>
    
    int main()
    {
            char *inpt;
            size_t len = 1024;
            size_t n;
    
            n = getline(&inpt, &len, stdin);
            inpt[n - 1] = '\0';
    
            printf("%s", inpt);
            return 0;
    
    }
    

    我有时也喜欢使用我自己编写的 getline() 的一个小修改版本。这个完全丢弃了尾随的换行符。

    #include <stdio.h>
    
    size_t mygetline(char *, size_t);
    
    int main()
    {
            char inpt[1024];
    
            mygetline(inpt, 1024);
            printf("%s", inpt);
            return 0;
    
    }
    
    size_t mygetline(char *s, size_t lim)
    {
            int c;
            size_t i;
            for ( i = 0 ; i < lim-1 && (c=getchar()) != '\n' ; ++i )
                    s[i] = c;
            s[i] = '\0';
            return i;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-12-21
      • 2015-01-16
      • 2022-01-05
      相关资源
      最近更新 更多