2

C で書かれたプログラムがあり、ユーザーがオプション 3 を選択すると、スイッチから gets() が呼び出されます。これが私のコードです。ユーザーが何かを入力するのを待っているようには見えません。むしろ、プログラムはスイッチで続行します。

void getField();

#include <stdio.h>
#include <string.h>
/*#include "stubs.c"
#include "record.h" */

int debugMode;

void getField(){
    char name[25];
    char address[80];
    int yearofbirth;
    char telno[15];
    int counter = 0;

    if(debugMode == 1){
        printf("***DEBUG*** Entering getField function \n");
    }

    printf("Enter your name:");
    gets(name);

    printf("Name: %s \n", name);
    printf("\n");
}

void main(int argc, char * argv[])
{
    struct record* start = NULL;
    int userChoice;
    debugMode = 0;

    if(argv[1] != NULL){
        if( (strcmp(argv[1], "debug") == 0) && (argv[2] == NULL) ){
            debugMode = 1;
            printf("Welcome, to the personal address book application \n");
        }
        else{
            int i = 0;
            while(argv[i] != NULL){
                printf(argv[i]);
                printf(" ");
                i++;
            }
            printf(": Command not found \n");
            userChoice = 6;
        }
    }

    if(argv[1] == NULL){
        printf("Welcome, to the personal address book application \n");
        userChoice = 0;
    }


    while(userChoice != 6)
    {
        if(debugMode == 1){
            printf("***DEBUG*** Entering do-while loop \n");
        }

        printf("Enter number corresponding number to option below \n\n");   

        printf("1) Add a new record in the database \n");
        printf("2) Modify a record in the database \n");
        printf("3) Print information about a record in the database \n");
        printf("4) Print all information in the database \n");
        printf("5) Delete an existing record from the database \n");
        printf("6) Quit program \n\n >");


        scanf("%d", &userChoice);

        switch(userChoice){

            case 1:
                /*addRecord(start, arrayHolder, arrayHolder, 0, arrayHolder);
                */userChoice = 0;
                break;
            case 2:
                /*modifyRecord(start, arrayHolder, arrayHolder, arrayHolder);
                */userChoice = 0;
                break;
            case 3:
                /*printRecord(start, arrayHolder);
                */userChoice = 0;
                getField();
                break;
            case 4:
                /*printAllRecords(start);
                */userChoice = 0;
                break;
            case 5:
                /*deleteRecord(start, arrayHolder);
                */userChoice = 0;
                break;
            case 6:
                printf("case 6 \n");
                break;
            default:
                printf("default \n");
                userChoice = 0;
                break;
        }

    }
    printf("\n");
}
4

3 に答える 3

9

呼び出しでオプションを入力するときはscanf()、キーボードで 2 つのキー (たとえば、3 と ENTER) を入力します。
は「3」scanf() を消費しますが、ENTER は入力バッファーにぶら下がったままにします。
後で、gets()ENTER が入力バッファ内にあることを行うと、それgets()が取得されます。

次の 2 つのオプションがあります。

  • それぞれの後に入力バッファをクリアしますscanf()
  • それぞれの前に入力バッファをクリアしますgets()

入力バッファをクリアするには、次のコードを使用します。

int clear_input_buffer(void) {
    int ch;
    while (((ch = getchar()) != EOF) && (ch != '\n')) /* void */;
    return ch;
}

おー!そして使用をやめるgets()gets()安全に使用することはできません。 代わりに使用してください。fgets()

于 2009-10-01T08:33:34.297 に答える
2

scanf("%d", ....)を使用して数値を読み取る場合、数値の後に入力した改行はまだそこにあり、プログラムが後で gets に到達したときに入力バッファーで待機しています。読み取られる行は、その改行だけで構成される非常に短い行になります。

標準では動作が保証されていないため、fflush(stdin)を使用しないでください。代わりに、改行をスキップするまでループ内で文字を読み取ることができます。

while (getchar() != '\n')
    ;

コードには他にもいくつかの問題があります。その中には、実際に gets をまったく使用してはならないものがあります。これは、読み取った行が実際に変数に収まるかどうかをチェックしないためです。代わりにfgetsを使用してください。

于 2009-10-01T08:33:56.170 に答える
-1

scanf 行に「\n」を追加してください。get は、選択した後に空の文字列と CR を読み取ります。

    scanf("%d\n", &userChoice);

GetField() では、printf の後に「fflush」と言います。

void getField(){
    char name[25];
    char address[80];
    int yearofbirth;
    char telno[15];
    int counter = 0;

    if(debugMode == 1){
        printf("***DEBUG*** Entering getField function \n");
    }

    printf("Enter your name:");
    fflush(stdout);
    gets(name);

    printf("Name: %s \n", name);
    fflush(stdout);
    printf("\n");
}
于 2009-10-01T08:24:55.297 に答える