加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

scanf函数的几个使用技巧<转>

(2011-12-31 20:35:22)
标签:

c

programming

杂谈

分类: C/CPP
一.scanf函数输入格式中的字符串

scanf函数输入格式中也可以含有普通字符串, 但他的含义是这些字符必须在输入中出现,例如:

int num;
scanf("hello %d", & num);

他的含义是首先要求输入一个hello字符串,然后再输入一个十进制数. 注意在等待输入时忽略hello与要输入的数之间的空格,制表符,回车. 因此这两种输入都是正确的:

hello 1234

hello1234

二.scanf函数的返回值

看到一个学弟写的程序:

#include
void main()
{
int num;
printf("please input the student's score: ");
scanf("%d",&num);
if((num<0)||(num>100))
{
printf("The score put isn't fine. please run and input again.");
}
else if(num>90)
{
printf("The grade is A.");
}

else if((num>80)&&(num<90))
{
printf("...................");
}
…………
}

这个程序是没错,不过如果有人要存心捣乱, 输入时不是输入数字,而是其他的什么字符,那么congratulations,这个程序崩溃掉了……

如何防止出现这种情况,有人通过把数字先读入到数组中,再判断读取的是不是一个数字........., 作法真的好繁.

如果知道scanf函数的返回值的话,这个问题就好办多了. scanf函数执行成功时的返回值为成功读取的变量数,如果第一个变量的读取既告失败则返回值为0.

哈哈哈,我们可以通过判断scanf函数执行的返回值, 可以制止用户不正确地输入,从而控制程序的流程.

把上面的程序改改为:

#include
main()
{
int num,int result=0;
printf("please input the student's score: ");
while(result==0)
{
fflush(stdin);
if(result!=1)printf("Please input a digital score: ");
result=scanf("%d",&num);
}
…………
}

一切OK!

三.scanf函数中一个参数的应用

在scanf函数中,我们可以使用 %c来读取一个字符,使用 %s 读取一个字符串. 但是读取字符串时不忽略空格,读字符串时忽略开始的空格,并且读到空格为止,因此我们只能读取一个单词,而不是整行字符串.因此一般使用fgets来读取一个字符串.

其实scanf函数也可完成这样的功能,而且还更强大.

这里主要介绍一个参数,%[ ] ,这个参数的意义是读入一个字符集合. [ ]是个集合的标志,因此%[ ]特指读入此集合所限定的那些字符, 比如 %[A-Z] 是输入大写字母,一旦遇到不在此集合的字符便停止. 如果集合的第一个字符是" ^ ", 这说明读取不在" ^ " 后面集合的字符,既遇到" ^ " 后面集合的字符便停止.注意此时读入的字符串是可以含有空格的.

Eg. 输入一个字符串, 这个字符串只含有小写字符.遇到第一个不是小写字符时停止.
scanf("%[a-z],str);

Eg. 想输入一个字符串, 遇到 "." 停止,可设计如下:
scanf("%[^.]", str);
使用这个参数,你可以完成许多强大的功能呦!

_____________________________________________________________

再说几句: 通常来讲,scanf函数和他的一些参数并不是很常用,主要是因为:

1.许多系统的scanf函数都有漏洞. (典型的就是TC再输入浮点型时有时会出错).

2.用法复杂,容易出错.

3.编译器作语法分析时会很困难,从而影响目标代码的质量和执行效率.

(转载自http://bbs.csai.cn/BBSOldArticle/B1/3BCF6640-44F3-457E-A496-2DF2210A2DE4.html)

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有