これは、与えられた文字列を並べ替える宿題です。でソートしたい文字列の数をユーザーに求め、その数に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
したがって、すべての文字列を入力できますが、文字列の最初のプロンプトが間違った場所にあります。