3

これは、与えられた文字列を並べ替える宿題です。でソートしたい文字列の数をユーザーに求め、その数にscanf基づいて配列を割り当ててから、 で文字列自体を取得していますfgets

文字列の数がハードコードされている場合はすべて正常に機能しますがscanf、ユーザーが決定できるようにするために を追加すると、問題が発生します。コードは次のとおりです。

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

#define LENGTH  20 // Maximum string length.

int main(void)
{
    int index, numStrings = 0;
    char **stringArray;
    printf("Input the number of strings that you'd like to sort: ");
    assert(scanf("%d", &numStrings) == 1);
    stringArray = (char **)malloc(numStrings * sizeof(char *));

    for (index = 0; index < numStrings; index++)
    {
        stringArray[index] = (char *)malloc(LENGTH * sizeof(char));
        assert(stringArray[index] != NULL);
        printf("Input string: ");
        assert(fgets(stringArray[index], LENGTH, stdin) != NULL);
    }

    // Sort strings, free allocated memory.

    return 0;
}

コンソールは次のようになります。

並べ替えたい文字列の数を入力してください: 3
入力文字列: 入力文字列: foo
入力文字列: bar

ループの最初の反復をスキップするため、配列の先頭に空の文字列が生成されます。私の質問は、なぜそれを行うのか、どうすれば修正できるのかということです。


"%d\n"に渡されたフォーマット文字列でコンソールがどのように見えるかを次に示しますscanf

並べ替えたい文字列の数を入力してください: 3
ふー
入力文字列: 入力文字列: bar
入力文字列: baz

したがって、すべての文字列を入力できますが、文字列の最初のプロンプトが間違った場所にあります。

4

2 に答える 2

6

scanf に \n を入力して、\n を上書きするように scanf に指示する必要があります。

scanf("%d\n", &numStrings)

それがなければ、scanf は残りの改行文字 [Enter ボタンが押されたときから] をループの最初の行として読み取ります。

于 2011-02-08T03:52:44.163 に答える
3

本当の答えは (私の謙虚だが非常に正しい意見では:P) を使用しないことscanfです。を使用fgetsして最初の行 (数字) を読み取り、その文字列を自分で解析しsscanfますstrtoul。そうすれば、誰かが適切な形式でデータを入力しなかった場合にエラーを処理することができ、scanfの堅牢な空白処理の欠如を回避する必要がなくなります。

また、int-4 の長さの配列が多数あると予想される場合を除き、サイズを格納するために を使用しないでください。標準では、符号なし型size_tは、オブジェクト サイズと配列インデックスを格納するのに十分な大きさの符号なし型として指定されています。他のタイプを使用しても、動作は保証されません。

于 2011-02-08T05:09:21.457 に答える