fgets()不忽略新行

时间:2014-01-21 22:23:45

标签: c newline fgets

对于我的练习作业,我必须使用gets()或fgets()。 我选择fgets()作为更安全的。

第一个输入意味着最多可以容纳5个字符。 所以我给char数组大小为6以容纳尾随'\ 0'。

我发现fgets()问题在你按Enter键时添加一个尾随的'\ n'(使用带有fgets()的stdin)

我做了一些研究,发现了一个for循环试图摆脱它。然而,它似乎没有工作,我不能为我的生活找出原因。

当我输入5个字符时,它仍然会跳过下一个输入。

以下是代码:

#include <stdio.h>
#include <string.h>

int main(void)
{
    //Declare char arrays
    char    arcInputString5[6];
    char    arcInputString10[11];
    char    arcInputString15[16];
    char    arcInputString20[21];
    int     clean1, clean2, clean3, clean4;
//  int     nStrLen1, nStrLen2, nStrLen3, nStrLen4;
//  nStrLen1 = nStrLen2 = nStrLen3 = nStrLen4 = 0;

printf("\nPlease Input String 1 - Max Length 5: ");
//gets(arcInputString5);
fgets(arcInputString5, 6, stdin);

for(clean1 = 0; clean1 < strlen(arcInputString5); clean1++)
{
    if(arcInputString5[clean1] == '\n' || arcInputString5[clean1] == '\r')
    {
        arcInputString5[clean1] = '\0';
        break;
    }
}

printf("\nPlease Input String 2 - Max Length 10: ");
//gets(arcInputString10);
fgets(arcInputString10, 10, stdin);

printf("\nPlease Input String 3 - Max Length 15: ");
//gets(arcInputString15);
fgets(arcInputString15, 15, stdin);

printf("\nPlease Input String 4 - Max Length 20: ");
//gets(arcInputString20);
fgets(arcInputString20, 20, stdin);

printf("\nThankyou For Your Inputs - They Are Shown Back To You Below\n");

puts(arcInputString5);
puts(arcInputString10);
puts(arcInputString15);
puts(arcInputString20);

printf("\nThe String Lengths For Each Input Are Listed Below");

printf("\n%d", strlen(arcInputString5));
printf("\n%d", strlen(arcInputString10));
printf("\n%d", strlen(arcInputString15));
printf("\n%d", strlen(arcInputString20));

}

我尝试了多种方法来执行for循环,例如使用数字6而不是“strlen(arcInputString5)”

任何帮助都将不胜感激。

编辑:

示例输入:

asd d

示例输出:

Please Input String 2 - Max Length 10: //skips this
Please Input String 3 - Max Length 15: //this is the next line for input

3 个答案:

答案 0 :(得分:2)

fgets()从stdin中读取一个字符,而不是给定的缓冲区大小 附加一个NUL字符。所以在你的情况下,输入缓冲区为6个字符, 它将“asd d”读入arcInputString5,并且终止该行输入的换行符仍未读取。

然后,下一个fgets()会将此换行符读取(仅)arcInputString10

你需要一个(至少)7的缓冲区大小来读取包含的五个字符“asd d” 来自stdin的换行符。

这同样适用于fgets()使用的其他缓冲区。

已添加:正如Jonathan Leffler正确评论的那样,更好的方法是提供 一个“大”输入缓冲区到fgets()并检查用户输入的实际长度 读一行。

您还应注意,如果根本无法读取任何字符,fgets()将返回NULL (文件结束),所以你应该检查返回值。

答案 1 :(得分:1)

6 更改为 7
arcInputString5[7];
fgets(arcInputString5, 7, stdin);

您需要为“ \ n ”和“ \ 0 ”字符留出空间。

瓦尔特

答案 2 :(得分:0)

在请求下一个用户输入之前,调用getchar()从输入流中检索换行符。

我喜欢使用以下简单函数来清除输入流

void clear() {
    while(getchar() != '\n');
}