在Strings中的do-while表单上发布

时间:2012-05-22 07:59:22

标签: c string do-while

好的,我是第一次尝试编程的学生,所以要善待;)这是在屏幕上打印“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形式中他需要检查消息[i ++]!='\ n'而不仅仅是消息[i]!='\ n'??

2 个答案:

答案 0 :(得分:3)

在我看来,编写输入循环的正确方法是:

fgets(message, sizeof message, stdin);

换句话说,不要使用逐字符循环,只需使用标准库的函数,该函数读取由换行符终止的字符串并完成。< / p>

答案 1 :(得分:1)

代码中的do { ... } while(...)循环一次读取一个字符并将其存储在message中。下一个字符的索引比前一个字符的索引多一个,这就是我们应该在存储当前字符后增加索引变量i的原因。算法是:

  1. 阅读下一个字符并将其存储在message[i]
  2. 如果此字符为'\n',请退出。
  3. 增加i并转到1。
  4. 表达式message[i++]在用作i的索引后递增message,以便下次我们将查看字符串中的下一个字符。因此,while (message[i++] != '\n')结合了第2步和第3步。

    for中的相同 - 循环:

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

    但正如@unwind指出的那样,最好不要使用char-by-char输入。