do-while循环“输入更多(y / n)” - 字符问题

时间:2014-08-19 04:43:12

标签: c character scanf do-while

所以我正在研究基本的C技能,我想设计一个代码,输入尽可能多的数字。然后,它应显示正,负和&的计数。输入零整数。 我搜索了Google&堆栈溢出。根据那些程序,代码似乎很好。 它编译和编译运行。但是每当我在提示后输入任何东西"输入更多? y / n",它返回代码.. 请看下面的代码:

#include<stdio.h>

int main() 
{
    int no,count_neg=0,count_pos=0,count_zero=0;
    char ch='y';
    clrscr();
    do
    {
        puts("Enter number");
        scanf("%d",&no);
        if (no>0)
            count_pos++;
        else if (no<0)
            count_neg++;
        else
            count_zero++;
        puts("want more? - y/n ");
        scanf("%c",&ch);
    }
    while (ch=='y');

    if (ch=='n')
    {
        printf("No of positives = %d",count_pos);
        printf("No of negatives = %d",count_neg);
        printf("No of zeros = %d",count_zero);
    }

    getch();
    return 0;
}

6 个答案:

答案 0 :(得分:1)

问题出在&#34; scanf(&#34;%c&#34;,&amp; ch);&#34;

实际发生的是:
 假设你进入&#39; y&#39;作为选择并点击“输入”(返回),返回是一个字符和
 它的字符值为10(因为它是一个新行字符),因此scanf采用&#39; return&#39;   作为其输入并继续。

解决方案: 1.在scanf()之前使用getchar()

//你的代码

  getchar();  
  scanf();  

//你的代码
getchar()将返回值作为输入,因此您将保留实际值。

  1. 添加&#39; \ n&#39; scnaf()
    //代码
     scanf(&#34; \ n%c&#34;,&amp; ch);
    //代码
  2. 当scanf()遇到&#39; \ n&#39;它跳过它的角色(谷歌关于scanf,知道如何
     以及为什么),因此将预期值存储在&#39;中。

答案 1 :(得分:0)

A&#34;更好&#34;表格:

int main()

是:

int main(void)

clrscr 不是标准C.

您应该检查任何可能表示“#34;有趣状态”的函数的返回值,&#34;例如失败条件,你可以从中优雅地处理这种情况。在这种情况下, scanf 就是这样一个功能。

我相信您的第一个执行...而条件将会变为false,因为它会在您的第一个 scanf 之后选择换行符字符呼叫。您可能希望阅读 getchar getc ,而不是使用 scanf 来检查是否再次运行循环。你可以&#34;吃&#34;不需要的字符,包括换行符

答案 2 :(得分:0)

在这里,我已经纠正了这个问题。问题在于&#34;进入&#34;你按下每个数字后面的一个字符,并由scanf()处理,因为它是扫描一些字符。所以我在getchar();之前添加了scanf();,因此&#34;输入&#34;由getchar();占用,scanf()现在可以自由地接受您的输入。

 #include<stdio.h>
 int main() 
  {
      int no,count_neg=0,count_pos=0,count_zero=0;
      char ch='y';
      clrscr();
      do
       {
         puts("Enter number");
         scanf("%d",&no);
         if(no>0)
         count_pos++;
         else if(no<0)
         count_neg++;
         else
         count_zero++;

         puts("want more? - y/n ");
         getchar();//<---- add this here 
         scanf("%c",&ch);
        }
        while(ch=='y');

    if(ch=='n')
    {
     printf("No of positives = %d",count_pos);
     printf("No of negatives = %d",count_neg);
     printf("No of zeros = %d",count_zero);
    }
    getch();
    return 0;
 }

答案 3 :(得分:-1)

修复输入是使用像此scanf一样的C字符串(&#34;%s&#34;,...);

如果你输入多个字符,这可能会中断,因为scanf会一直读到用户点击进入,而你的ch变量只有一个字符的空间。

答案 4 :(得分:-1)

我在在线编译器中运行你的代码。我不确定其他编译器。

我略微改变了你的代码。即,首先我读取char然后int。如果我不改变顺序, char变量保持int变量值。这就是原因(ch变量保存无变量的值)。

 #include<stdio.h>
 int main() 
 {
  int no,count_neg=0,count_pos=0,count_zero=0;
  char ch='y';

  do
   {
     puts("Enter number");
     scanf("%c",&ch);
     scanf("%d",&no);
     if(no>0)
     count_pos++;
     else if(no<0)
     count_neg++;
     else
     count_zero++;
     puts("want more? - y/n ");        
    }
    while(ch=='y');
    if(ch=='n')
    {
     printf("No of positives = %d",count_pos);
     printf("No of negatives = %d",count_neg);
     printf("No of zeros = %d",count_zero);
    }

    return 0;
    }

编辑:         每当通过键盘读取整数和字符时。它存储int值并输入键值。所以这就是原因。

你必须添加

scanf("%d",&no);
you code
......
.....
fflush(stdin);
scanf("%c",&ch);

答案 5 :(得分:-1)

使用:

ch = getche();

而不是:

scanf("%c", &ch);