2

文字列を使用できますが、私が取り組んでいるこの小さな例がこのように動作する理由と、どうすれば修正できるかを理解したいですか?

int ReadInput() {
    char buffer [5];
    printf("Number: ");
    fgets(buffer,5,stdin);
    return atoi(buffer);
}

void RunClient() {
    int number;
    int i = 5;
    while (i != 0) {
        number = ReadInput();
        printf("Number is: %d\n",number);
        i--;
    }
}

これにより、理論的には、または少なくとも私の頭の中では、入力から 5 つの数値を読み取ることができます (ただし、それらは上書きされます)。

ただし、これは当てはまりません。何があっても 0 を読み取ります。

printf が \0 null ターミネータを置くことは理解しています...しかし、デフォルトで 0 にするだけでなく、最初の数字を読み取ることができるはずだとまだ思います。そして、残りの数字がOKである理由がわかりません(すべて0ではない)。

明確化:私は 4/5 の数字しか読めません。最初は常に 0 です。

編集:

私はテストしましたが、これが問題を引き起こしているようです:

main.cpp

scanf("%s",&cmd);
    if (strcmp(cmd, "client") == 0 || strcmp(cmd, "Client") == 0)
        RunClient();

何とかして。

編集:

誰かがコンパイルしたい場合のコードは次のとおりです。まだ直し方がわからない

http://pastebin.com/8t8j63vj

最終編集:

エラーを取り除くことができませんでした。単純に @ReadInput を追加することにしました

int ReadInput(BOOL check) {
    ...
    if (check) 
       printf ("Number: ");
    ...

@RunClient()

void RunClient() {
    ...
    ReadInput(FALSE); // a pseudo - buffer flush. Not really but I ignore 
    while (...) {                    // line with garbage data
        number = ReadInput(TRUE);
        ...
    }

そして、それを一日と呼びます。

4

2 に答える 2

3

fgets入力と改行文字を読み取ります。したがって、数字を入力すると、次のようになります123\n

atoi変換が失敗したときにエラーを報告しません。

から改行文字を削除しますbuffer

buf[5];
size_t length = strlen(buffer);
buffer[length - 1]=0;

次にstrtol、文字列を数値に変換するために使用します。これにより、変換が失敗した場合のエラー検出が向上します。

于 2012-11-26T10:50:11.113 に答える
1
char * fgets ( char * str, int num, FILE * stream );

ストリームから文字列を取得します。

stream から文字を読み取り、(num-1) 文字が読み取られるか、改行またはファイルの終わりに到達するまで、C 文字列としてstrに格納します。

改行文字はfgetsの読み取りを停止させますが、関数によって有効な文字と見なされ、str にコピーされる文字列に含まれます。(これはあなたが運ぶことを意味します\n)

str にコピーされた文字の後に、終端のヌル文字が自動的に追加されます。fgets は gets とはまったく異なることに注意してください。fgets はストリーム引数を受け入れるだけでなく、str の最大サイズを指定して、文字列に改行文字を含めることもできます。

PD: バッファーを大きくしてみてください。

于 2012-11-26T10:53:52.110 に答える