2

Enterキーが押されるまで不明な長さの文字列を読み取り、charポインタを返す関数を作成しました。スイッチケースの内側から関数を呼び出すと、入力を待機しません。

char *get_paths()
{
    unsigned int length_max = 256; /*Initial length of string*/
    unsigned int current_size; 
    current_size = length_max;

    /* Allocating memory for string input */
    char *tmpStr = malloc(length_max);

    /* Simple check to make sure our pointer is not NULL */
    if(tmpStr != NULL)
    {
        int c = EOF; 
        unsigned int i = 0;

        printf("Enter The EXACT or RELATIVE File Paths Separated by a Space: ");

        /* Accept input until Enter key is pressed or user inserts EOF */
        while((c = getchar()) != '\n' && c != EOF)
        {
            tmpStr[i] = (char)c;
            ++i;

            /* If memory is filled up, reallocate memory with bigger size */
            if(i == current_size)
            {
                current_size = i + length_max;
                /* realloc does magic */
                tmpStr = realloc(tmpStr, current_size); 
            }
        }

        /* A valid string always end with a '\0' */
        tmpStr[i] = '\0';
        printf("Got it: %s \n", tmpStr); /*TODO: REMOVE;; USED FOR TESTING*/
        return tmpStr; 
    }
}

スイッチケース(スイッチブロックからchar * ptr = NULLがあります):

/*File input*/
case 1:
    ptr = get_filepaths();
break;

出力:

スペースで区切って正確または相対的なファイルパスを入力してください:了解しました:

4

2 に答える 2

2

のバッファリングで問題が発生している可能性があります。stdoutこれがprintfデフォルトです。バッファを強制的にフラッシュするには、最初のステートメントの最後に明示的にフラッシュするstdoutか、改行文字を挿入する必要があります。printf「Gotit」ステートメントの最後に改行文字があるため、2番目のステートメントがバッファーのフラッシュを強制するため、両方のステートメント(最初のステートメントはバッファーに入れられます)が同時に出力に出力されます。

もう1つの可能性は、に未読データがすでに存在する可能性があり、 -loopstdinを呼び出すと、以前にバッファリングされたデータを読み取り、改行文字をヒットしてから、新しい情報を入力するのではなく、ループを終了します。この問題を回避するには、バッファオーバーフローを気にせずに、入力にすでに含まれている次の改行(改行自体を含む)まで入力を消費するようなことを行います。getchar()whilescanf("%*[^\n]%*c");

于 2012-12-02T03:30:04.003 に答える
-1

この問題を「どうにかして」回避するために私が見つけた解決策は、最初の呼び出しのgetchar()直後に権利を追加することでした。なぜこれが機能するのかわからない!printf()

于 2012-12-02T04:44:30.323 に答える