0

stdin から行を取得する次のコードがあります。

char string[USR_SIZE+1];
/*USR_SIZE is 9 */ 
fgets(string, USR_SIZE, stdin);
size_t len = strlen(string);
if (string[len-1] == '\n') {
    // read in whole line, no need to clear buffer
    string[len-1] = 0;
}    
else {
    if(feof(stdin)){
        printf("EXACT LEN\n");
    }
    else{
        //username too long, clear stdin and retry
        printf("Dumping...");
        dump_line(stdin); //clear stdin
        /*something that loops until success*/

    }

}

バッファに改行がないということは、または文字列が切り取られたことをstring意味します。EOF

今。必要な最適な文字列は"user_123"(8 文字) のようになります。"user_12345678"正しく入力"user_123"すると、else本体のみが保存されて実行されます。入力"user_123"すると、else body も実行されます。

"user_123"( EOF) 文字列と (カットされた) 文字列を区別したい"user_1234"のは、この最後の場合のみ入力が正しくないためです。なぜfeof設定されていないのですか?

さらにfgets、エラー管理の戻り値を確認するにはどうすればよいですか?

この解決策を見つけました:

if (fgets(string, USR_SIZE + 1, stdin)){
    if (strlen(string) == USR_SIZE && string[USR_SIZE - 1] == '\n'){
        printf("EXACT\n");
        /* User entered an eight character string. */
        string[USR_SIZE - 1] = 0;
    }
    else{
        if(strlen(string) < USR_SIZE-1){
        printf("INVALID<<<\n");
        /*don't dump*/
    }
        else{
            printf("INVALID>>>\n");
            dump_line(stdin);
        }
    }

    printf("EXIT\n");
    printf("%s\n", string);
}
else{
    free(auth_data);
    EXIT_ON_ERROR_("Error while getting user input\n");
}
4

1 に答える 1

0

改行だけでなく 8 文字と EOF を許可する場合は、次のようにします。

char buf[10];
fgets(buf, 10, stdin);

int len=strlen(buf);
if (buf[len-1] == '\n') buf[len-1] = '\0';
if (strlen(buf) == 8)
    puts("Correct length");
else
    puts("Incorrect length");

(fgetsこの例では、成功するかどうかはテストされていません)

于 2013-03-29T22:26:25.907 に答える