c - fgets() 不忽略换行符

标签 c newline fgets

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

第一个输入最多可容纳 5 个字符。 所以我将 char 数组的大小指定为 6 以容纳尾随的 '\0'。

我发现 fgets() 问题是当您按 Enter 键时添加尾随“\n”(使用 stdin 和 fgets())

我做了一些研究,发现了一个 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

最佳答案

fgets() 从 stdin 读取比给定缓冲区大小少一个字符的数据,然后 附加一个 NUL 字符。所以在你的例子中,输入缓冲区有 6 个字符, 它将“asd d”读入arcInputString5,并且终止行输入的换行符仍然未被读取。

接下来的fgets()然后(仅)将此换行符读取到arcInputString10中。

您需要(至少)7 的缓冲区大小来读取五个字符“asd d”,包括 来自标准输入的换行符。

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

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

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

关于c - fgets() 不忽略换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21270323/

相关文章:

c - C 中的 Neville 算法

c - 在 C 中执行 while 循环

php - php 函数中 ftell 的输出

c - stdio 函数(sprintf、vsprintf 和 fprintf)背后的命名约定是什么?

对使用 ftell() 检查文件是否为空感到困惑

c - 当我打开文件时会发生什么(RAM 和 ROM 很重要)

python - 在文件末尾写入新行

c++ - 测试换行符

c - 如何在 C 中使用 fgets 从用户那里获取整数?

C fgets 语义错误