对于我的练习作业,我必须使用 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/