是/否不起作用 do{ p++; printf(“输入您的姓名:”); scanf(“%s”,字符串(&s); fprintf(fw,“%d\n%s\n”,p,字符串); printf(“输入您的电话号码:”); scanf(“%d”、&cislo); fprintf(fw,“%d\n”,cislo); printf(“如果要添加更多数据,请按Y,否则请按N”); c=getchar(); 而(getchar()!='\n') ; 如果(c='Y') k++; 其他的 printf(“您决定不继续。”); }p

是/否不起作用 do{ p++; printf(“输入您的姓名:”); scanf(“%s”,字符串(&s); fprintf(fw,“%d\n%s\n”,p,字符串); printf(“输入您的电话号码:”); scanf(“%d”、&cislo); fprintf(fw,“%d\n”,cislo); printf(“如果要添加更多数据,请按Y,否则请按N”); c=getchar(); 而(getchar()!='\n') ; 如果(c='Y') k++; 其他的 printf(“您决定不继续。”); }p,c,C,您好,代码的结尾似乎不起作用,因为当我输入Y时,它显示“您决定不继续”,这是胡说八道,因为它应该将k增加1,再增加一次(p和k在程序开始时声明,p=0;k=1;您能告诉我解决方案吗?您应该在读取其他内容之前清空stdin缓冲区 do { p++; printf("Enter your name: "); scanf("%s", &string); fprintf(fw, "%d\n%s\n",p, string);

您好,代码的结尾似乎不起作用,因为当我输入Y时,它显示“您决定不继续”,这是胡说八道,因为它应该将k增加1,再增加一次(p和k在程序开始时声明,p=0;k=1;您能告诉我解决方案吗?

您应该在读取其他内容之前清空
stdin
缓冲区

do {
        p++;
        printf("Enter your name: ");
        scanf("%s", &string);
        fprintf(fw, "%d\n%s\n",p, string);
        printf("Enter your telephone number: ");
        scanf("%d",&cislo);
        fprintf(fw, "%d\n",cislo);
        printf("If u want to add more datas press Y otherwise press N ");
        c = getchar();
        while (getchar() != '\n')
            ;
        if ( c == 'Y')
            k++;
        else
            printf("You decided not to continue.");
    } while (p < k);
此函数用于清空stdin缓冲区

void emptyBuffer() {
    char c = 'a';
    while (c != '\n' && c != EOF) {
        c = getchar();
    }

    return;
}
因为当您使用
getchar()
时,可能会得到上一个问题(/answer)的最后一个
'\n'

顺便说一句(根据之前的评论) 你应使用:

    printf("Enter your name: ");
    scanf("%s", &string);
    emptyBuffer();

    fprintf(fw, "%d\n%s\n",p, string);
    printf("Enter your telephone number: ");
    scanf("%d",&cislo);
    emptyBuffer();

    fprintf(fw, "%d\n",cislo);
    printf("If u want to add more datas press Y otherwise press N ");
    c = getchar();

哪个更方便用户:)

使用
c=getchar();
您正在读取电话号码输入的
'\n'
(返回)

要避免它,您必须刷新
stdin
,或者在这种情况下,调用
getchar()
两次

另一种简单的方法是使用scanf完成工作:

   if ( c == 'Y' || c == 'y' )
编辑

根据OP的要求,完整的解决方案可以是:

scanf("%s", c);
if (( c[0] == 'y') || ( c[0] == 'Y'))
   k++;

您确定键入的是“Y”而不是“Y”?!更改您的条件并检查较低的“Y”。可能您需要这样的内容:
if(c=='Y'| c=='Y'){…}
。此外,
c
应该是一个
int
。是的,我确定我键入了Y,我甚至试着把c='Y'放在那里,键入Y,但都是一样的。编辑:while循环;before是因为在我按Y之后,可能会有重复的,您当然会在上次扫描之后删除左边的新行,对吗?Also当然,您试图通过打印出变量c实际包含的内容来调试代码。非常感谢您的工作,但是您能告诉我为什么我在代码中c=getchar()之前调用该函数,而不是之后调用该函数吗?假设用户响应:name:kaldoran\n(\n由于输入)scanf将获得“kaldoran”,然后编号:000000\n(再次输入)scanf将获得“000000”,但stdin再次包含“\n”,因此您需要删除该“\n”这就是为什么我们清空stdin缓冲区,以删除所有垃圾字符如果这一个有效,你能接受答案吗?Thxy抱歉,现在我明白了,非常感谢你,我以前忘记接受它了:D抱歉,现在我这么做了谢谢你的回复它也是这样工作的编辑:不,它有效,因为我声明了p=0和k=1,所以第一次它增加了如果我按n键p到1,不客气,先生。记住更改while条件。查看我以前的帖子我解释了do-while循环OK。我编辑了。我看到两者都是0。总之,正如我所说,这可能很愚蠢,如果你有更好的解决方案,还有更“聪明”的方法。你能写出来吗?
do
{
    printf("Enter your name: ");
    scanf("%s", &string);
    fprintf(fw, "%d\n%s\n",p, string);

    printf("Enter your telephone number: ");
    scanf("%d",&cislo);
    fprintf(fw, "%d\n",cislo);

    printf("If u want to add more datas press Y otherwise press N: ");
    scanf("%s", c);

} while (( c[0] == 'y') || ( c[0] == 'Y'));

printf("You decided not to continue.\n");