4

私が bash で書いたこの実装に似た同等のソリューションはありますか? 通常、私は常に動的割り当てを次のように処理してきました。

(2 番目の実装は柔軟性があり、必要な入力の数を正確に知る必要がなく、そのまま入力できるため、2 番目の実装が気に入っています。C で同様のアプローチを実現するにはどうすればよいでしょうか?

C 実装:

double* get_data(int* data_size)
{
    double* data_set = NULL;
    int size = get_size();
    int i;

    *data_size = size;

    data_set = malloc(size * sizeof(double));

    for(i = 0; i < size; i++) 
    {
        printf("Enter statistical data: ");
        scanf("%lf", &data_set[i]);
    }

    return data_set;
}

バッシュの実装:

data_set=()
while IFS= read -r -p 'Enter statistical data (empty line to quit):' input; do
  [[ $input ]] || break
  data_set+=("$input")
done
4

3 に答える 3

3

の問題scanf("%lf", &data_set[i]);scanf()、空白行を含む先頭の空白を静かにスキップすることです。

空の行で終了したいので、明らかな解決策は、行を使用するfgets()getline()、行を読み取ってsscanf()から、行が空でないときにデータを読み取ることです。

したがって:

char line[4096];
while ((fgets(line, sizeof(line), stdin) != 0)
{
    if (line[0] == '\n')
        break;
    if (sscanf(line, "%lf", &data_set[i++]) != 1)
        ...format error...
}

各 I/O 機能がチェックされていることに注意してください。空の行に 1 つまたは 2 つの空白を入力すると、「フォーマット エラー」コードに入ります。必要に応じて、「空白行」のテストをより敏感にすることができます (たとえば、strspn()andの使用を検討してください)。strlen()

于 2013-10-11T15:14:02.947 に答える