输入y时,循环将跳过宏do while循环

时间:2015-08-13 11:40:39

标签: c

我需要这方面的帮助...我的问题是当我执行这个程序时,当我想重复滚动时,滚动将不会从第二次开始显示...我该怎么办?我不知道该怎么做才能解决这个问题..卡在这里

#include <stdio.h>
#include <stdlib.h>
int main()
{
  int i, a, n, z;
  char player[5][150], b, c;
  float ave, total, f1, f2, f3;

  total = 0;
  ave = 0;
  printf("\nPlease enter number of players : ");
  scanf("%d", &a);

  for (i = 0; i < a; i++)
  {
    printf("\nEnter player %d's name : ", i + 1);
    scanf("%s", &player[i][150]);
  }

  printf("\nChoose the amount of dice used : ");
  scanf(" %d", &n);

  do
  {
    for (z = 1; z <= a; z++)
    {
      printf("\n\t%s\n ", player[z]);

      if (n == 1)
      {
        do
        {
          f1 = 1.0 + 6.0 * ((float) rand() / RAND_MAX);
          printf("\nRoll : %.0f\n", f1);
          total = f1;
          printf("Total : %.0f\n", total);
        }while (f1 == 6);
      }
      else if (n == 2)
      {
        do
        {
          f1 = 1 + (rand() % 6);
          f2 = 1 + (rand() % 6);
          printf("\nRoll : %.0f,%.0f\n", f1, f2);
          total = f1 + f2;
          printf("Total : %.0f\n", total);
        }while (f1 == f2);
      }
      else if (n == 3)
      {
        do
        {
          f1 = 1 + (rand() % 6);
          f2 = 1 + (rand() % 6);
          f3 = 1 + (rand() % 6);
          printf("\nRoll : %.0f,%.0f,%.0f\n", f1, f2, f3);
          total = f1 + f2 + f3;
          printf("Total : %.0f\n", total);
        }while (f1 == f2 && f2 == f3);
      }
    }
    printf("\nRoll again ? (y/n) = ");
    scanf("%s", &b);
  }while (b == 'y');
  printf("\n");

  ave = total / n;
  printf("Average : %.2f\n\n", ave);

  return 0;
}

2 个答案:

答案 0 :(得分:4)

首先是

scanf("%s", &b);

应该是

scanf("%c", &b);

你必须为你的do while冲洗你的stdin才能工作。

while ((c = getchar()) != '\n' && c != EOF);

以便携式方式刷新stdin

答案 1 :(得分:0)

%s读取一个C字符串,即一个空终止的char数组。包含'y'的最短字符串是2个字符的数组:"y"{ 'y', '\0'}

因此,您应该使用char b;更改char b[2];,并以这种方式使用它:

    scanf("%1s", b);
}while (*b == 'y');

当前代码在字符b调用未定义行为后写入(至少)null:之后可能发生任何事情。但scanf("%1s", b);只读取b[0]中的第一个非空白字符,并在b[1]中放置空格:正确。

但恕我直言,除非你确定,否则永远不要将输入忽略空白(空格,制表符,行尾)(%d%s%f...)与输入明确地处理它们(%cfgets)。为什么你这样做。所以我不建议你使用scanf("%c", b);