今天写门禁系统遇到一个问题,调试了很久,虽然达到了想要的效果,但是搞不懂为什么要这样写,如下:
#include
int main(){
char door[5];
int i;
printf("请选择门号:");
scanf("%d",&i);
printf("请输入第%d号门的权限:",i);
scanf("%c",&door[i]);
return 0;
}
运行结果如下:
#include
int main(){
char door[5];
int i;
printf("请选择门号:");
scanf("%d",&i);
printf("请输入第%d号门的权限:",i);
scanf(" %c",&door[i]);
return 0;
}
运行结果如下:
然后这样
#include
int main(){
char door[5];
int i;
printf("请选择门号:");
scanf("%d",&i);
printf("请输入第%d号门的权限:",i);
scanf("%s",&door[i]);
return 0;
}
运行结果如下:
我就不明白了为什么%c和%s还有 %c(前面加有一个空格)会有这些结果,对于输入字符串是该用%s,可我这儿是输入Y和N,是一个字符,为什么还要用%s呢,用%c就不对呢?
因为你前面输入门号的时候需要按下回车键来转入下一个scanf,也就是说你输入的是一个数字+一个字符。
如果要第二个scanf用%c得到自己输入的字符,可在第一个scanf和第二个scanf之间加入一个getchar来取掉输入数字时输入的字符。
之所以用 空格%c 和%s能够不需要getchar掉跟随数字进入缓冲区的那个字符是因为 scanf的格式匹配字符串中空格表示空白字符的占位符(任何空白字符都会自动匹配上这个空格,所以相当于这个空白字符被getchar掉了)
而%s则会忽略前导的空白字符(刚好这个空白字符在取掉数字后就位置就处于第一位了,也被忽略掉了)
我没看出你输出结果有啥出错的,第一个你是按了个空格吧
#include
int main()
{
char door[5];
int i;
printf("请选择门号:");
scanf("%d",&i);
printf("请输入第%d号门的权限:",i);
{
//清除上一个scanf的缓存,因为它接受了一个数字和回车符号,
//不然下一个scanf()用%c接受字符串的时候,会将上一个的回车符接收到,
//而不会停下来去等待用户去输入一个字符。
//getchar();//或者适用getchar去接受上一个的回车符
//fflush(stdin);//非标准C,linux下不适用,windows可以使用
setbuf(stdin,NULL);//将输入缓冲区清空,linux适用
}
//scanf("%c",&door[i]);
scanf(" %c",&door[i]);//或者先去用一个空格去把上一个的回车符匹配掉也可以。
return 0;
}
如果不加空格,你上一行的输入会影响到你当前的字符输入;建议你以后输入字符串的时候直接scanf("%s",door);