跳过scanf getchar函数

时间:2012-11-20 12:57:23

标签: c

一个非常简单的问题。为什么在第一个while循环中跳过scanf。 我已经尝试使用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;
}

3 个答案:

答案 0 :(得分:6)

这是因为scanf会在输入缓冲区中留下'\n'(endline)符号。在getchar循环的第一次迭代中,while(1)将使用此符号。

答案 1 :(得分:3)

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

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

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

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

答案 2 :(得分:1)

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