1

私はこの問題を何時間もグーグルで調べてきましたが、これまでのところ言及されていません。

int getInt()
{
    char* rawin = (char*)malloc(100);
    printf("How big should the secret code be?\n(Input number of elements):\n");

    while(fgets(rawin, 100, stdin) != NULL)
    {
        if (sscanf(rawin,"%d") == 1)
        {
          break;
        }
        printf("Numbers only please.\n");
    }
    int in = atoi(rawin);
    free(rawin);
    return in;
}

この関数を 2 回呼び出すと、最初に呼び出した方は正常に動作しますが、2 回目はおかしな動作をします。while ループに入るのではなく、プログラムは fgets を無期限にループするかのように動作します。fgets の 2 回目の呼び出しは完了しないため、何も返されません。デバッグ時、"while(fgets..." の後 (ループの後を含む) のどこかに配置されたブレークポイントには到達しません。標準入力の末尾に "\n"、"\0"、"\n\0" を追加してみました。 「\n」または「\0」ではないすべての文字を読み込んで標準入力を「フラッシュ」しようとしましたが、これも何もしませんでした。

編集:明確にするために、「if」ステートメントの条件はプレースホルダーです。

4

2 に答える 2

2

データをどこかに保存する必要があります:

if (sscanf(rawin,"%d") == 1)

つまりsscanf()、3 番目の引数が必要です。この変換の結果を格納する整数へのポインターです。

int in;
if (sscanf(rawin,"%d",&in) == 1)

この後、電話する必要はありませんatoi()


補足として、あなたの例では動的に割り当てられたメモリは必要ありません。単純な配列で十分です。

char rawin[100];
于 2013-03-21T13:33:44.023 に答える
-3

標準入力をノンブロッキングにしてみてください。

#include <unistd.h>
#include <fcntl.h>

fcntl(0, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);

recvまたは、代わりに fgets の代わりにノンブロッキングを使用します。

#include <sys/socket.h>

while(recv(0, inputString, 100, MSG_DONTWAIT) > 0)
于 2013-03-21T13:26:00.807 に答える