C fgets()不是';t再次提示用户
下面是代码的编写方式C fgets()不是';t再次提示用户,c,C,下面是代码的编写方式 int main() { char enteredName[30]; char stringNum[4]; char continueLetter = 0; int continueProgram = 0; int enteredAge; int i; do { memset(enteredName,'\0', 30); printf("Please enter a name: ");
int main()
{
char enteredName[30];
char stringNum[4];
char continueLetter = 0;
int continueProgram = 0;
int enteredAge;
int i;
do
{
memset(enteredName,'\0', 30);
printf("Please enter a name: ");
fgets(enteredName, 29, stdin);
printf("\n\nNow please enter your age: ");
fgets(stringNum, 3, stdin );
for(i = 0; i < 30; i++)
{
if (enteredName[i] == '\n')
{
enteredName[i] = '\0';
break;
}
}
for(i = 0; i < 4; i++)
{
if (stringNum[i] == '\n')
{
stringNum[i] = '\0';
break;
}
}
enteredAge = atol(stringNum);
} while();
intmain()
{
字符输入名称[30];
char-stringNum[4];
char continueLetter=0;
int continueProgram=0;
国际教育;
int i;
做
{
memset(输入名称,'\0',30);
printf(“请输入名称:”);
fgets(输入名称,29,标准输入);
printf(“\n\n现在请输入您的年龄:”;
fgets(stringNum,3,标准输入);
对于(i=0;i<30;i++)
{
如果(输入名称[i]='\n')
{
输入的名称[i]='\0';
打破
}
}
对于(i=0;i<4;i++)
{
if(stringNum[i]='\n')
{
stringNum[i]='\0';
打破
}
}
enteredAge=atol(stringNum);
}while();
当我第二次运行循环时,我无法在char数组中输入新名称,它只会进入下一个提示(age)。除非此问题涉及链表,否则问题似乎出在其他方面。您能帮我找到错误吗?谢谢!您的第二次
fgets
调用会留下字符(特别是换行符)等待从stdin
读取,如果输入两位数的年龄
增加长度参数以匹配数组大小:
fgets(stringNum, 4, stdin);
或者更好:
fgets(stringNum, sizeof stringNum, stdin);
您可能希望对enteredName
执行相同的操作
从:
fgets()
函数读取的字符数最多比字符数少一个
由给定流中的大小指定,并将其存储在字符串中
str
您不需要像现在这样为空终止符保留额外的数组项-
fgets
将自己正确处理它。问题是,您不知道已读取的字符串是否包含换行符。如果它不包含换行符,那么这将被读取y下一次调用fgets
,在其中留下一个空字符串。要防止出现这种情况,请检查该行末尾是否包含换行符
字符。如果不是这样,请使用getchar()
和瞧!!(请注意,此解决方案仅对您的问题有效,而不是一般情况下)。此代码将在读取stringNum
字符串后添加
if(stringNum[strlen(stringNum)-1]!='\n')
{
getchar();
}
这是因为,如果年龄是两位数,那么fgets
将一直读取到最后一位数,而不是换行符。因此,如果最后一个字符不是\n
,则需要读取它。如果年龄是一位数,则原始程序工作正常。问题是,您没有刷新输入缓冲区这就是为什么fgets()
会将您直接带到第二个提示询问年龄。这是遇到的常见问题,只需添加fflush(stdin);//我的编译器在fgets()之后支持它。
。以下是对我有效的代码,希望它也对您有效:
编辑:关于fflush()
。正如所描述的,fflush基本上是用来调用输出流的。虽然一些编译器提供了对flushstdin
的支持,但这被认为是一种未定义的行为。在重新查看该程序时,我发现使用sizeof
可以产生奇迹,并且是有效的,因此,我修改了该程序这里的一个答案也描述了sizeof
的用法
#include<stdio.h>
#include<stdlib.h>
int main()
{
char enteredName[30];
char stringNum[4];
int continueProgram=0;
int i;
while(continueProgram<3)
{
setbuf(stdout,NULL);
printf("Please enter a name: ");
fgets(enteredName, sizeof enteredName, stdin);
printf("\n\nNow please enter your age: ");
fgets(stringNum,sizeof stringNum, stdin );
for(i = 0; i < 30; i++)
{
if (enteredName[i] == '\n')
{
enteredName[i] = '\0';
break;
}
}
for(i = 0; i < 4; i++)
{
if (stringNum[i] == '\n')
{
stringNum[i] = '\0';
break;
}
}
//enteredAge = atol(stringNum);
continueProgram++;
}
return 0;
}
#包括
#包括
int main()
{
字符输入名称[30];
char-stringNum[4];
int continueProgram=0;
int i;
而(continueProgram您可以尝试以下代码:
if(stringNum[strlen(arr)-1]=='\n')
stringNum[strlen(arr)-1]='\0';
else
while(getchar()!='\n');
无论何时输入两位数的年龄,按enter键时插入的换行符都会存储在缓冲区中。
上面这段代码的作用是,它将检查存储的最后一个字符是否用换行符填充,如果是,则将用空终止符替换它。
否则,它将一直从缓冲区读取,直到并除非从缓冲区中删除换行符
PS:如果您使用的是borland,那么您将使用fflush(stdin)从缓冲区中清除PHlFounder指示的任何额外字符,但是如果您碰巧使用gcc,那么这种方法非常好
您还可以为这段代码创建一个函数或宏,并在每次需要时调用它,例如
void function(char * arr)
{
if(arr[strlen(arr)-1]=='\n')
arr[strlen(arr)-1]='\0';
else
while(getchar()!='\n')
}
谢谢你,伙计,这个fflush真是太神奇了。我发现的另一个方法就是在底部多放一个getchar,但那只会处理一个剩余的部分。我会多读一点,这非常有用。谢谢你的帮助,我必须道歉,但这不是全部代码;我认为这是一部分主要的issue。剩下的代码包含一个用于“用Y/N继续程序”的char变量。它没有像我的“for循环”那样检查“\N”,所以我只是用一个简单的fflush来修复它。再次感谢您的帮助,祝您玩得愉快!请注意,您应该在每次使用它之后检查fgets()
中的返回值。