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基本上是用来调用输出流的。虽然一些编译器提供了对flush
stdin
的支持,但这被认为是一种未定义的行为。在重新查看该程序时,我发现使用
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()
中的返回值。