为什么输入字符型字母要同时运用scanf和getchar才能成功?
下面是我编的程序,只要是单独运用scanf或者是getchar就输入不了,求大神解答#include<stdio.h>intmain(void){voidbubble1(...
下面是我编的程序,只要是单独运用scanf或者是getchar就输入不了,求大神解答
#include<stdio.h>
int main(void){
void bubble1(int a[], int n);
void bubble2(int a[], int n);
int i,a[10];
char ch;
printf("Enter 10 number:\n");
for (i = 0; i < 10; i++)
scanf("%d", &a[i]);
printf("Enter A or D:\n");
scanf("%c", &ch);\\<-------------------------------就是这里,只要是单独用scanf或者是getchar,就执行不了,
ch = getchar();\\<-----------------------------------系统会自动跳过这一段,直接执行后面的,一定要一起用才有用
if (ch=='A'){
bubble1(a, 10);
}
else{
bubble2(a, 10);
}
printf("After sorted,a[10]=");
for (i = 0; i < 10; i++)
printf("%d ", a[i]);
return 0;
}
void bubble1(int a[], int n){
int i, j, t;
for (i = 1; i < 10; i++)
for (j = 0; j < 10 - i;j++)
if (a[j]>a[j + 1]){
t = a[j]; a[j] = a[j + 1]; a[j + 1] = t;
}
}
void bubble2(int a[], int n){
int i, j, index, temp;
for (i = 0; i < 9; i++){
index = i;
for (j = i+1; j < 10;j++)
if (a[index]<a[j]){
temp = a[index];
a[index] = a[j];
a[j] = temp;
}
}
} 展开
#include<stdio.h>
int main(void){
void bubble1(int a[], int n);
void bubble2(int a[], int n);
int i,a[10];
char ch;
printf("Enter 10 number:\n");
for (i = 0; i < 10; i++)
scanf("%d", &a[i]);
printf("Enter A or D:\n");
scanf("%c", &ch);\\<-------------------------------就是这里,只要是单独用scanf或者是getchar,就执行不了,
ch = getchar();\\<-----------------------------------系统会自动跳过这一段,直接执行后面的,一定要一起用才有用
if (ch=='A'){
bubble1(a, 10);
}
else{
bubble2(a, 10);
}
printf("After sorted,a[10]=");
for (i = 0; i < 10; i++)
printf("%d ", a[i]);
return 0;
}
void bubble1(int a[], int n){
int i, j, t;
for (i = 1; i < 10; i++)
for (j = 0; j < 10 - i;j++)
if (a[j]>a[j + 1]){
t = a[j]; a[j] = a[j + 1]; a[j + 1] = t;
}
}
void bubble2(int a[], int n){
int i, j, index, temp;
for (i = 0; i < 9; i++){
index = i;
for (j = i+1; j < 10;j++)
if (a[index]<a[j]){
temp = a[index];
a[index] = a[j];
a[j] = temp;
}
}
} 展开
2个回答
展开全部
因为scanf("%c", &ch);只接收一个字符,会把输入的'\n'留在输入缓冲区;而'\n'也是字符,后面的输入语句会把它接收而收不到你输入的有用字符,所以会出错。写成scanf("%c", &ch);getchar();后getchar();会把遗留在缓冲区中的那个'\n'接收掉,就不会出错了。但你scanf("%c", &ch);ch=getchar();这样写也不行,ch就只是个'\n'了,后面就用不成ch了,把ch=去掉就可以了……
追问
我刚试了一下scanf("%c", &ch);ch=getchar();也是可以运行出来的,这是为什么?还有还有,我想问,如果前面scanf输入一个整形数字,对后面的scanf输入为什么不会有影响?
追答
前面的输入整型数字也会把'\n'遗留在输入缓冲区里,但要看后面的scanf输入是什么类型的,如果还输入整型,则不影响后面的输入,因为接收整型时不接收其他字符;但如果后面是输入字符的,那就要受影响,把前面遗留的'\n'当一个字符接收了……所以,并不是只要用scanf就得用getchar(),而是在接收字符的语句前面要用getchar之类的函数清除缓冲区里的遗留字符,以保证后面接收字符正确。
展开全部
可能是我俩用的环境不同,code:blocks可以单独用他们,在scanf前面经常加一个getchar,是因为,如果在scanf之前有其他输入,在最后输入enter时,是个字符,会被scanf读取,用getchar是用来吃enter的,
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
char c,a;
c=getchar();
getchar();//用来吃掉上一句的enter,如果不加,那么a字符就是enter了
scanf("%c",&a);
printf("%c %c \n",c,a);
return 0;
}
getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符.getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
char c,a;
c=getchar();
getchar();//用来吃掉上一句的enter,如果不加,那么a字符就是enter了
scanf("%c",&a);
printf("%c %c \n",c,a);
return 0;
}
getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符.getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询