从零开始学C语言系列之第三章《scanf》

往期回顾

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。

  • 23
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值