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 に答える