如何从C中的fgets中删除多余的字符输入?

时间:2015-05-22 03:54:47

标签: c input output overflow fgets

我听说在C编程中使用gets()是不好的,使用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

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

answer: 123

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

2 个答案:

答案 0 :(得分:6)

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);

答案 1 :(得分: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;
}