往期回顾
1.【第一章】《认识C语言》
2.【第二章】C语言概述及基本知识1
3.【第二章】C语言概述及基本知识2
4.【第三章】字符串和格式化输入/ 输出
5.【第三章】printf
规则说明
scanf()函数使用指向变量的指针,目前只用记住两条规则:
- 如果使用scanf()读取基本变量类型的值,在变量前面加个&
- 如果使用scanf()把字符串存储到字符属数组中,不使用&
#include <stdio.h>
int main(void)
{
int age; // variable
float assets; // variable
char pet[30]; // string
printf("Enter your age, assets, and favorite pet.\n");
scanf("%d %f", &age, &assets); // use the & here
scanf("%s", pet); // no & for char array
printf("%d $%.2f %s\n", age, assets, pet);
return 0;
}
#include <stdio.h>
#define PRAISE "You are an extraordinary being."
int main(void)
{
char name[40];
printf("What's your name? ");
scanf("%s", name);
printf("Hello, %s. %s\n", name, PRAISE);
return 0;
}
注意,scanf它会遇到的第一个空白(空格、制表符或换行符)时就不在输入
所以scanf只会读取字符串中的第一个单词,一般用于输入函数(字符串)的话用fgets()
-
scanf()函数每次读取一个字符,跳过所有的空白字符,直到遇到第一个非空白字符才开始读取。
-
如果使用字段宽度,scanf()在字段末尾或者第一个空白字符的时候停止读取,无法利用字段宽度让只有一个%s的scanf()读取多个单词,最后要注意一点:当scanf()把字符串放进指定的数组的时候,它会在字符序列的末尾添加上’\0’,让数组中的内容成为一个C字符串。
例如:
/*
scanf(Angle Planins)时 遇到Anglea的时候就已经停止输入
*/
转化说明
转换说明 | 输出 |
---|---|
%c | 字符 |
%s | 字符串 |
%d | 有符号十进制整数 |
%u | 无符号十进制整数 |
%o | 无符号八进制整数 |
%x | 无符号十六进制整数(小写) |
%X | 无符号十六进制整数(大写) |
%f | 小数形式的浮点数(float) |
%lf | 小数形式的浮点数(double) |
%e | 指数形式的浮点数(小写) |
%E | 指数形式的浮点数(大写) |
%g | 以小数形式和指数形式中宽度较短的形式输出浮点数,并且不输出无意义的0(小写) |
%G | 以小数形式和指数形式中宽度较短的形式输出浮点数,并且不输出无意义的0(大写) |
%p | 地址 |
%% | 一个百分号 |
换说明中的修饰符
转换说明 | 转换说明 |
---|---|
* | 抑制赋值,示例:“%*d" |
数字 | 最大字段宽度,输入达到最大字段宽度处,或者第一次遇到空白字符为止,示例:“%10s” |
hh | 把整数作为signed char 或者 unsigned char 类型读取 |
ll | 把整数作为long long或者unsigned long long类型读取(C99),示例:“%lld”、“%llu” |
h、l或者L | “%hd"和”%hi”表明把对应的值存储为short int类型;“%ho”、“%hx"和”%hu"表明把对应的值存储为unsigned short int类型;“%ld"和”%li"表明把对应的值存储为long类型;“%lo”、“lx”和“%lu”表明把对应的值存储为unsigned long类型;“%le"、”%lf“和"%lg"表明把对应的值存储为double类型;在e、f和g前面使用L而不是l,表明把对应的值被存储为long double类型,如果没有修饰符,d、i、o和x表明对应的值被存储为int类型,f和g表明把对应的值存储为float类型 |
j | 在整形转换说明后面时,表明使用intmax_t或者uintmax_t类型(C99)示例:“%jd”、“%ju” |
z | 在整形转换说明后面时,表明使用sizeof的返回类型,示例:“%zd”、”%zo" |
t | 在整形转换说明后面时,表明使用表示两个指针差值的类型 ,示例:“%td”、“%tx” |
从scanf角度看输入
假设,scanf()根据一个%d转化说明读取到一个整数
- scanf 函数每次只读取一个字符,先跳过所有非空白字符,知道遇到第一个非空白字符后才开始读取,因为要读取整数,所以如果下一个字符并不是数字或者符号
+或-
(遇到非数字字符),scanf则会认为已经读到了末尾,然后将这个非数字字符放回输入。这意味着下一次开始读的时候,第一个读到的就是这个数字字符 - 如果第一个字符不是数字字符的话。scanf则一直无法越过读取下一个字符,因为
C规定在第一天字符出错时则停止输入
- 注意,所有空白的概念是指包含没有空格的特殊情况
scanf的返回值
- 成功情况:
- 返回成功读取的项数
- 读不到任何项(如需要读取一个数字但是前面是个非数字类型的字符)
- 返回0
- 读到文件结尾
- 返回
EOF
,这是stdio.h中定义的特殊值,通常用#define定义成-1
- 返回
scanf("%d %d",&a,&b);
函数返回值为int型。如果a和b都被成功读入(输入都是数字),那么scanf的返回值就是2;
如果只有a被成功读入(其中一个是数字),返回值为1;
如果a和b都未被成功读入(例如输入q,2.5等字符),返回值为0;
如果遇到错误或遇到end of file,返回值为EOF。end of file相当于Ctrl+z 或者Ctrl+d。