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(...)循环一次读取一个字符并将它们存储在message. 下一个字符的索引比前一个字符的索引多一个,这就是为什么我们应该i在存储当前字符后增加索引变量。算法是:

  1. 读取下一个字符并将其存储在message[i].
  2. 如果这个字符是'\n',退出。
  3. 增加i并转到 1。

表达式在用作 的索引后message[i++]递增,因此下次我们将查看字符串中的下一个字符。因此,结合步骤 2 和 3。imessagewhile (message[i++] != '\n')

相同的for循环:

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

但正如@unwind 指出的那样,最好不要使用逐字符输入。

于 2012-05-22T08:01:21.650 回答