これは宿題を指定していくつかの文字列を並べ替えるためのものです。 scanf
でソートしたい文字列の数を入力し、その数値に基づいて配列を割り当ててから、fgets
で文字列を取得します。scanfとfgetsの問題
文字列の数がハードコードされていればすべてうまく動作しますが、ユーザがネジを決定できるようにscanf
が追加されています。ここでは、コードです:それは、配列の先頭に空の文字列で、その結果、ループの最初の反復をスキップし
Input the number of strings that you'd like to sort: 3 Input string: Input string: foo Input string: bar
:
#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;
}
そして、ここでは次のようにコンソールが見えるものです。私の質問は、それがなぜそれを行うのか、それをどうすれば解決できるのかということです。ここで
は、コンソールがscanf
に渡されたフォーマット文字列"%d\n"
に見えるものです:だから
Input the number of strings that you'd like to sort: 3 foo Input string: Input string: bar Input string: baz
、私がすることができ、入力文字列のすべてが、文字列の最初のプロンプト間違った場所にあります。 [ヒットされたボタンを入力したときから]
scanf("%d\n", &numStrings)
それなしで、scanf関数は、残留改行文字を読み込みます:
ユーザー入力を読み取る入力関数など、合理的に失敗する可能性がある関数に対して 'assert()'を実行しないでください。エラーを無視するよりも優れています。エラーをうまく処理するほど良くはありません。 –
@Jonathanアドバイスをいただきありがとうございます。 – gdejohn