为什么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语句都照此改过,应该就没有问题了……
供参考。