对于我的练习作业,我必须使用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
答案 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');
}