问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

为什么while 里的输出 语句执行了2次,。,

发布网友 发布时间:2023-09-16 18:32

我来回答

5个回答

热心网友 时间:2024-11-24 05:11

执行两次是因为输入1的时候,后面还有一个回车,被当做第二个字符了,所以while执行了2次。

scanf是阻塞型获取键值语句。需要使用非阻塞型的获取语句getch(),但是要加上头文件conio.h。

程序中还有的问题是if...else的执行问题,代码如下:

#include <stdio.h>
#include <conio.h>
int main ()
{
  int low=0;
  int cap=0;
  int num=0;
  int els=0;
  int sta=0;
  char ch;
  printf("请输入 第一个字符:");
  ch = getch();//scanf("%c",&ch);修改为getch+printf两句
  printf("%c\n", ch);
  while (ch !='.')
  {
    switch (sta)
    {
      case 0:if(ch>='a' && ch<='z') 
                sta=1;
             else if (ch>='A' && ch <='Z')//+else
                sta=2;
             else if (ch>='0' && ch<'a')//+else
                sta=3;
             else  sta =4;
                printf("执行0 sta %d",sta);
             break;
      case 1:low +=1;
             if(ch>='a' && ch<='z') 
                sta=1;
             else if (ch>='A' && ch <='Z')//+else
                sta=2;
             else if (ch>='0' && ch<'a')//+else
                sta=3;
             else  sta =4;
                printf("执行1 sta %d",sta);
             break;
      case 2:cap +=1;
             if(ch>='a' && ch<='z') 
                sta=1;
             else if (ch>='A' && ch <='Z')//+else
                sta=2;
             else if (ch>='0' && ch<'a')//+else
                sta=3;
             else  sta =4;
                printf("执行3  sta %d",sta);
             break;
      //自行修改case 3,case 4和default中的语句
    }
    printf("\n请输入下一个字符:");
    ch = getch();//scanf("%c",&ch);修改为getch+printf两句
    printf("%c\n", ch);
  }
  return 0;
}

 可拷贝代码检查,已修改正确

热心网友 时间:2024-11-24 05:12

首先有一个问题可能需要说明,这种scanf采用的是带有缓冲区的读取方式。

在你的测试数据中:
(1)在循环外面,你认为你通过键盘这种标准输入设备,输入的只有一个字符‘1’,但实际上你输入的是“1 回车符”,这之后进入输入缓冲区的实际上是两个字符,即‘1’和‘回车符’(没记错的话16进制是0x0A)。
(2)在循环外面,&ch又告诉输入流到缓冲区里读入一个字节(因为该指针指向一个字符,而字符是一个字节),所以这一次它读出了字符‘1’,此时缓冲区由于没有清空,里面还有一个‘回车符’。
(3)再循环里面,你有调用了一次scanf,它先从缓冲区里面读入字符,发现还有一个‘回车符’,所以,当进入下次循环的时候又满足了循环条件,所以又执行了一次输出。

修改方法:
(1)有人已经写明了,就是用getch+printf来替代scanf,因为getch是一种不带回显的读入方式,所以要加printf自己进行回显输出。
至于所谓的阻塞型获取键值语句,说明朋友很厉害呢,呵呵,我不太愿意记这些,看字面完全不知道为什么,为什么阻塞就是这种效果。
关键就在,scanf采用缓冲,而且必须有以下两种情况scanf才会从缓冲区里面读取数据:
1.缓冲区满,谁会等到它满呢………………
2.输入回车换行符,强制从缓冲区读取,这也是为什么,使用scanf的时候每次输入完毕必须
输入回车换行,而使用getch不需要输入回车换行,而只需要输入一个自己即可的原因。
而gerch是没有必须这两个条件的。
(2)你可以在两个scanf中间,加一个getch将缓冲区中的回车换行符吸收掉,都是常用的方法。

热心网友 时间:2024-11-24 05:12

while 的上面有一个,里面有一个,所以两个

热心网友 时间:2024-11-24 05:13

Let me see the question.

热心网友 时间:2024-11-24 05:13

把两个 scanf("%c",&ch);语句都改成 scanf(" %c",&ch);(在%前加一个空格)。再就是if语句有逻辑错误,不应该用用并列if和if...else语句,而应该用if...else if ...else语句。如:
case 0:if(ch>='a' && ch<='z')
sta=1;
if (ch>='A' && ch <='Z')
sta=2;
if (ch>='0' && ch<'a')
sta=3;
else sta =4;
printf("执行0 sta %d",sta);
break;
应改成
case 0:if(ch>='a' && ch<='z')
sta=1;
else if (ch>='A' && ch <='Z')
sta=2;
else if (ch>='0' && ch<'a')
sta=3;
else sta =4;
printf("执行0 sta %d",sta);
break;
把几个case中的if语句都照此改过,应该就没有问题了……
供参考。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 黑客攻击报案有用吗 因4楼他的下水道莫名堵塞且将5楼我的下水道进行封堵,请问如何解决?是否... 四川省南充市医保缴费标准 梦见我抢别人的链子 coc松树外面怎么才能披金链子 寓言小故事简短:树上的金链子 梦见金链被抢 我想问一下用别人家的WiFi怎样增强信号 面包可以用空气炸锅进行制作吗 北京丰台区航天部家属院地址 北京海清苑谁住的 外交部家属院有哪些 我昨天面试了一家公司,加了他家公司的一个面试官,今天我在微信上拒绝... 有个面试是我自己约的,但是后来我加了那个人微信觉得环境不喜欢,不想去... 我们是否有权举报外网? 有人使用,能举报吗? 种瓜得瓜,种豆得豆。 中星9B的高频头可以用在普通的接收机上接收KU波段的节目吗? 中九高频头和南星高频头有什么区别呢? 语文就像一片森林,里面有许多快乐的小鸟在唱动听的曲子,让我们精神愉 ... 怎么修改第三次 c语言问题,输出两次。。 ...为什么这个程序结果会连续输出两次问句啊??(前两张图) 还有最后一... 【急】C语言问题,为什么会重复输出呢? 奥迪A8激光大灯多少钱 我的世界,为什么下载mod说 未找到安装脚本 求职 男年龄三十四不抽烟不喝酒不会开车想找个跟车下乡送货工资两千五... 一般 铁艺门 多重 门式脚手架能承受多重 请问一下门式脚手架能承受多少重量呀?急. 用12*12*4的方管5米能承受多少重量 两个人见过7,8次面,看过3次电影,但是男生没有拉女生手,怎么了 我刚认识一个女孩,我和她约了3次会,一起逛公园吃饭看电影,她都愿意,不 ... 跟一个男人逛街看电影吃饭两三次,为什么男的不牵着女方的手? 她跟我一起去玩了三次,第一次看电影,第二次帮我挑衣服,第三次陪我... 男友很迟钝 我们出去看电影 我们之间都没有牵过手 没有kiss 。这是我们... ...征信报告必须要亲自到人行打印吗,不知道网上可不可以打印_百度... 2021秋季部编语文1-6年级上册 【赛课课件】人教部编版六年级上册语文《聊聊书法》课件 求qq女头像图片 多发几张 孔子的师德观包括 求一张女生头像的图片 有原图发给我好吗