【C语言天天练(二十)】scanf函数详解

引言:scanf函数虽然是学习C语言时比较早就接触的一个函数,但在使用过程中,发现真正掌握它却并不容易。本文就通过各种例子来详细的总结一下该函数的各种用法,假设它的调用格式为 scanf("<格式化字符串>",<地址表>)。

1、一般使用scanf函数时都是为某个变量赋值,不考虑它的返回值。但是任何函数都是需要返回的(即使返回类型用void,也可以认为只是调用了return语句,只是并没有返回什么东西而已),同样的scanf函数也是有返回的,它的返回值是成功读取变量的个数。如果有一个输入与变量格式不匹配,那么返回值为0。如:

scanf("%d %d", &num1, &num2); 

如果输入两个中间有空格隔开的数字(如2 3),那么它的返回值是2。如果输入一个浮点数一个整数,则返回值是1。如果输入一个字符一个整数,则返回值是0。

2、scanf函数的<格式化字符串>与后面的<地址表>是必须严格匹配的。注意,是严格匹配,可以说不能有丝毫差别,但对于连续多个空格可以等同于一个空格。如:

scanf("%d, %d", &num1, &num2);

要想输入正确,必须输如一个整数,然后输入一个逗号(,),之后是第二个整数。最后是回车结束。

scanf("%d,%d", &num1, &num2);

该条语句中的<格式字符串>中的两个%d之间没有空格,如果此时输入:12 ,13回车(12后面先有一个空格后由逗号),那么num2并不等于13。反过来,输入:“12”、“,”、“空格”、“13”,则不会出现错误。

3、scanf函数用%s读取一个字符串时,其实它只能读取一个单词,因为遇到空格时,它会认为输入已结束。因此一般使用fgets来读取一个字符串。如果想用scanf函数读取带有空格的字符串时,需要使用参数%[ ]来完成,它的意思是读入一个字符集合。[ ]是个集合的标志,%[ ]特指读入此集合所限定的那些字符,比如%[A-Z]是输入大写字母,一旦遇到不在此集合的字符便停止。如果集合的第一个字符是“^”,这说明读取不在"^"后面集合的字符,既遇到"^"后面集合的字符便停止(这就是scanf函数里的正则表达式应用)。注意:此时读取的字符串是可以含有空格的。如:

scanf("1123%s",&str);

输入:1123aaabb 时str为 aaabb,但是,输入 24aabbdd时,   会出错,因为1123必须进行严格匹配。

scanf("%[^\n]", &str);

此时输入fdjkf fkdjf jdkf,然后输入回车,就给str赋值为fdjkf fkdjf jdkf。

scanf("%[A-Z]",&str);输入除A到Z的任何字符(包括空格、回车)都会停止。

4、对于下面两条语句

scanf("%d ", &num);/*scanf("%d\n", &num);*/
printf("%d",num);

我们输入一个整数后,无论在输入多少个空格、回车、Tab,都没有输出;但是当再次输入非空白字符时,如输入2 然后输入空格然后输入4,最后输入回车,则会有输出。

5、对于scanf函数的%c格式转换符,可以接受任何的非空白字符或空白字符(包括空格、回车、Tab甚至是F2这样的字符)。

	char str;

	scanf("%c", &str);
	printf("str = %c\n", str);

如果输入:空格……/*……代表任意空白字符或非空白字符*/,则str被赋值为空格。

如果输入:回车,则str被立即赋值为换行字符‘\n’。

如果输入:fjdkfj,则str被赋值为f,f后面的jdkfj丢弃。

【C语言天天练(二十)】scanf函数详解

时间: 2024-12-17 04:51:50

【C语言天天练(二十)】scanf函数详解的相关文章

【C语言天天练(十二)】命令行参数

C程序的main函数具有两个形参.第1个通常称为argc,它表示命令行参数的数目.第2个通常称为argv,它指向一组参数值. 指针数组:这个数组的每个元素都是一个字符指针,数组的末尾是一个NULL指针.argc的值和这个NULL值都用于确定实际传递了多少个参数.argv指向数组的第1个元素,这就是它为什么被声明为一个指向字符的指针的指针的原因.注意:通常第1个参数就是程序的名称. 示例: #include <stdio.h> int main(int argc, char **argv) {

【C语言天天练(十五)】字符串输入函数fgets、gets和scanf

引言:如果想把一个字符串读到程序中,必须首先预留存储字符串的空间,然后使用输入函数来获取这个字符串. 读取字符串输入的第一件事是建立一个空间以存放读入的字符串. char *name; scanf("%s", name); 这段代码虽然可能通过编译,但因为name可以指向任何地方,所以它的输入值可能覆盖以前name所指位置的值. 解决办法是声明一个固定大小的字符数组,或者使用C库里的分配存储空间的函数. 1.gets函数从系统标准输入获得一个字符串,读取字符串直到遇到一个换行符(\n)

【C语言天天练(十九)】restrict关键词

引言:在内核的系统调用函数里,经常遇到函数的参数使用restrict限定词限定的情况,下面就对该关键词做个总结. 1.restrict关键词是C99特性才添加的,因此在编译使用含有该限定词的程序时,一定要在后边添加-std=c99的标志,使得gcc能够支持c99标准. 2.restrict既然是个限定词,那么它限定什么变量呢?它只能限定指针变量!经过它限定的数据对象,表明指针时访问该数据对象的唯一且初始的方式.注意:这里的唯一表明了,由它限定的指针所指向的数据块,只能由该指针访问,不能由除它之外

【C语言天天练(十八)】字符/字符串输入函数fgetc、fgets、getc、getchar和gets

#include <stdio.h> int fgetc(FILE *stream); char *fgets(char *s, int size, FILE *stream); int getc(FILE *stream); int getchar(void); char *gets(char *s); fgetc()读取文件指针stream所指向文件的下一个字符,返回值是所读取字符强制类型转换成整数的值,如果到达文件尾部或者出错,则返回EOF. getc()与fgetc()函数相同,只是它

【C语言天天练(十六)】字符串输出函数puts、fputs和printf

C有三个用于输出字符串的标准库函数puts().fputs()和printf(). 1.puts()函数只需要给出字符串参数的地址. #include <stdio.h> int puts(const char *s); 示例: #include <stdio.h> #define DEF "I am libing" int main(int argc, char **argv) { char str1[30] = "I am libing."

【C语言天天练(十)】结构体

引言:数据经常以成组的形式存在.在C中,使用结构可以把不同类型的值存放在一起. 结构的声明有两种 1.struct SIMPLE{ int a; char b; float c; };然后用标签SIMPLE去声明结构体变量. 2.typedef struct{ int a; char b; float c; }Simple;然后用Simple去声明结构体变量.此时Simple是个类型名,而不像上面的SIMPLE是个标签. 结构成员可以是标量.数组.指针甚至是其他结构. 结构成员的直接访问用点操作

【C语言天天练(十四)】const关键字详解

const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性,另外,了解const的作用,在看别人的代码时,对理解对方的程序有一定帮助. 1.const可以理解成是"只读变量"的限定词,从这里可以看出,const修饰的是变量,跟常量是不同的,常量是被编译器放在内存中的只读区域,当然也就不能够去修改它.而"只读变量"则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改.const就是用来限定一

C语言scanf函数详解

函数名: scanf 功 能: 运行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息.能够读入不论什么固有类型的数据并自己主动把数值变换成适当的机内格式. 其调用格式为:      scanf("<格式化字符串>",<地址表>); scanf()函数返回成功赋值的数据项数,出错时则返回EOF. 其控制串由三类字符构成: 1.格

scanf函数详解

函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]);scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息.可以读入任何固有类型的数据并自动把数值变换成适当的机内格式.其调用格式为:      scanf("<格式化字符串>",<地址表>);scanf()函数返回成功赋值的数据项数,出错时则返回EOF.其控制串由三类字符构成:1.格式化说明符: 2.