0

わかりました、私はプログラミングを初めて経験した学生なので、親切にしてください ;) これは、文字列を「n」回画面に出力する正しいコードです...

#include <stdio.h>
#include <string.h>

#define MAX 80+1+1 /* 80+\n+\0 */

int main(void)
{
  char message[MAX];
  int i, n;

  /* input phase */
  printf("Input message: ");
  i = 0;
  do {
    scanf("%c", &message[i]);
  } while (message[i++] != '\n');
  message[i] = '\0';

  printf("Number of repetitions: ");
  scanf("%d", &n);

  /* output phase */
  for (i=0; i<n; i++) {
    printf("%s", message);
  }

  return 0;
}

do-while フォームで、message[i] != '\n' だけでなく、message[i++] != '\n' かどうかを確認する必要があるのはなぜですか??

4

2 に答える 2

3

その入力ループを記述する適切な方法は、私の意見では、次のようなものです。

fgets(message, sizeof message, stdin);

つまり、文字単位のループを使用せず、改行で終了する文字列を読み取る標準ライブラリの関数を使用するだけで完了です。

于 2012-05-22T08:35:27.497 に答える
1

コード内のdo { ... } while(...)ループは、文字を一度に 1 つずつ読み取り、message. 次の文字のインデックスは、前の文字のインデックスよりも 1 つ多いためi、現在の文字が格納された後にインデックス変数を増やす必要があります。アルゴリズムは次のとおりです。

  1. 次の文字を読み取り、 に格納しmessage[i]ます。
  2. この文字がの場合'\n'、終了します。
  3. 増やしiて1へ。

式は、 へのインデックスとして使用された後にmessage[i++]インクリメントされるため、次回は文字列内の次の文字が表示されます。したがって、手順 2 と 3 を組み合わせます。imessagewhile (message[i++] != '\n')

同じ inforループ:

int i;
for (i = 0; scanf("%c", &message[i]) && message[i] != '\n'; ++i);

しかし、@unwind が指摘したように、文字ごとの入力を使用しない方がよいでしょう。

于 2012-05-22T08:01:21.650 に答える