scanf()中的陷阱

关于scanf()函数中存在许多陷阱,是c语言初学者要注意的。

#include <stdio.h>   
main() 
	int a; float b; char c; 
	printf("请输入a的值:"); 
	scanf("%d",&a); 
	printf("请输入b的值:"); 
	scanf("%f",&b); 
	printf("请输入c的值:"); 
	scanf("%c",&c); 
	printf("a=%d,b=%f,c=%c",a,b,c); 
}
        这段代码很简单,但是在运行过程中,你在输入a和b的值后系统就自动在屏幕上输出a和b的值并结束运行了

   我们每次在输入一个变量的值后,必须按回车键告诉程序我已经完成了这个变量的输入并输入下一个变量的值,但回车键或空格键、制表键本身也都算是一个字符。 当输入的变量的格式是char字符格式时,&c就会自动接收我们之前输入的回车键,则无法输入这个scanf语句的内容了。 
在这个程序中就体现为scanf("%c",&c);语句中的&c自动接收我们在输入变量b的值后按的那个回车。 
解决办法就是在scanf("%c",&c);语句中的双引号中%c前面加上空格或者tab键。注意要加到双引号里面,如果加到双引号前面了是没有作用的。 


第二个问题

#include<stdio.h> 
main() 
	int a,b; 
	printf("请输入两个数\n"); 
	scanf("%d,%d",&a,&b); 
	printf("a=%d,b=%d\n",a,b); 
}

在输入 a 的值后直接按回车就会发生运行错误
先输入1,再输入“,”,再输入2。 

这里存在一个特例,就是在printf语句中多次提到的转义符\n 
在printf函数语句中我们经常通过转义符来完成我们对输出内容形式的一些需要,但是在scanf语句中没必要使用,这个\n在scanf语句中并没有什么用。

scanf("\n%d%d",&a,&b); 
scanf("%d\n%d",&a,&b); 
转义符放在双引号内容的前面或中间,\n可以直接无视,

但如果像下面这样。 
scanf("%d%d\n",&a,&b); 
\n放在了双引号里内容的最后,在输入a和b的值时我们就会发现在输入a和b两个变量的值后无论你按多少个回车程序都不会进行下一步的运行,即用printf函数输出a和b。 
那么应该怎样解决这个问题呢? 
答案是在输入变量a和b的值后你还需要随便再输入一个值,然后再按回车系统就会正常输出a和b的值,而你最后随便输入的那个值并不会在最后的输出中体现出来。 
出现这个问题的原因是:如果输入数据用转义符结尾,scanf会跳过后面的转义符去接受下一个字符。 
直观地描述就是如果你用转义符结尾,程序就会跳过你接了下来输入的回车或空格,直到你输入下一个字符。 
在这里要注意的是上面所指的会导致系统出现问题是转义符(在这里准确的说是空白符),也就是说不只是\n,\t(制表符号)、tab键和空格键都会发生同样的问题。

最后,有这样一个简单的程序,是网上看别人写的

#include<stdio.h>
int main()
{
	char a[10005];
	int n,i,j;
	scanf("%d ",&n);
	while(n--)
	{

		a[0]=0;
		i=1;
		a[i]=getchar();
	
		while(a[i]!='\n')
		{
			if(a[i]==']' && a[i-1]=='[' || a[i]==')' && a[i-1]=='(')
			{
				i--;
			} 
			else
			{
				i++;
			} 
			a[i]=getchar();
	}
	if(i>1) 
		printf("No\n");
	else
		printf("Yes\n");
	}
	return 0;
}

这里有很多巧妙的地方,我也不是很理解,待解决......


  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值