2

一个非常简单的问题。为什么 scanf 在第一个 while 循环中被跳过。我已经通过使用 getchar() 进行了尝试,结果是相同的。getchar 被跳过。

如果你们不明白我在说什么,你可以尝试编译它,你们就会明白我在问什么。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct rec{
    int num;
    char pref[16];
    float point;
    struct rec* next;
}rec;

void dataInput(float*,char*);
rec* insertNode(rec*);

int main(){

    int i=1;
    rec* entr,*pt = NULL;
    entr = (rec*) malloc(sizeof(rec));
    entr->num = i;
    dataInput(&entr->point,entr->pref);
    entr->next = NULL;
    char key;
    i++;

    while(1){

        printf("Continue ? If YES press 'y',or NO press 'n'\n");
        key = getchar();
        if(key == 'n')break;
        else if(key == 'y'){
            if(!pt){
                pt = insertNode(entr);
            }else{
                pt = insertNode(pt);
            }
            dataInput(&pt->point,pt->pref);
            pt->num = i;
            i++;
            continue;
        }else{
            printf("Wrong key! Please Press again! \n");
        }

    }

    pt = entr;
    while(pt){

        printf("num : %d, pref :  %s, point: %.1f\n",
                pt->num,
                pt->pref,
                pt->point);
        pt = pt->next;
    }

    getchar();
    getchar();
    return 0;
}

void dataInput(float* point,char* pref){

    printf("Input Point\t : ");
    scanf("%f",point);

    printf("Input Pref\t : ");
    scanf("%s",pref);
}

rec* insertNode(rec* current){
    rec* newnode = (rec*)malloc(sizeof(rec));
    current->next = newnode;
    newnode->next = NULL;
    return newnode;
}
4

3 回答 3

7

这是因为将在输入缓冲区中scanf留下一个(结束线)符号。此符号将在此循环的第一次迭代中'\n'被消耗。getcharwhile(1)

于 2012-11-20T12:59:36.083 回答
3

getchar()在输入缓冲区中留下一个换行符,由后续的 scanf() 读取。

您可以通过在 scanf 中使用前导空格来解决此问题:

scanf(" %c ...", &c,..);

它告诉 scanf 忽略所有空白字符。或者getchar()在第一个 getchar() 之后使用另一个来使用换行符。

于 2012-11-20T13:02:25.117 回答
1

只需getchar()在 the 之后使用另一个scanf()来消耗换行符。

于 2020-07-18T04:50:51.287 回答