C语言scanf函数转换说明表及其修饰符表
1. 对于上一篇文章,总结printf()输出,C库也包含了多个输入函数, scanf()是最常用的一个,也是经常与printf()经常一起搭配使用的函数之一.
scanf()和printf()类似, 也是使用格式字符串和参数列表. scanf中的格式字符串表明字符输入流的目标整数类型.两个函数主要的区别在参数列表中. printf()函数使用变量, 常量和表达式, 而scanf()函数使用指向变量的指针, 指针将在后续学习中总结. 使用scanf()有一下两个规则:
1⃣️ 如果用scanf()读取基本变量类型的值, 在变量名前加上一个&;
2⃣️ 如果用scanf()把字符串读入字符串数组中, 不要使用&.
举例一:
#include <stdio.h>
int main(int argc, const char * argv[]) {
int age;
float assets;
char per[];
printf("Enter your age,assets,and favorite\n");
scanf("%d",&age);
scanf("%f",&assets);
scanf("%s",per);
printf("%d, $%.2f %s\n",age,assets,per);
return ;
}
打印结果
Enter your age,assets,and favorite 43.25
apple
, $43.25 APPLE
Program ended with exit code:
2. 总结完基本规则, 我们先把列表转换说明附上
ANSI C 中scanf基本转换说明

ANSI C 中scanf转换说明修饰符

3. 从scanf() 角度看输入
假设scanf()根据一个%d转换说明读取一个整数. scanf()函数每次读取一个字符, 跳过所有的空白字符, 直至遇到第一个非空白字符才开始读取. 因为要读取整数, 所以scanf()希望发现一个数字字符或者一个符号(+或-).如果遇到一个数字或符号, 它便保存该字符, 并读取下一个字符. 如果下一个字符是数字, 它便保存该数字并读取下一个数字. scanf()不断第读取和保存, 直到遇到非数字字符. 如果读取到一个非数字字符, 它便认为读到了整数的末尾. 然后,scanf()把非数字字符放回输入. 这意味着程序在下一次读取输入时, 首先读到的是上一次丢弃的非数字字符. 最后, scanf()计算已读取数字(可能)相应的数值, 并将计算后值放入指定的变量中.
示例二:
#include <stdio.h>
int main(int argc, const char * argv[]) {
int age;
char name[];
scanf("%d",&age);
scanf("%s",name);
printf("%d,and %s \n", age,name);
return ;
}
打印结果
wuhan
,and wuhan
Program ended with exit code:
4. 如果使用字段宽度, scanf()会在字段结尾或第一个空白字符处停止读取( 满足两个条件之一就停止)
#include <stdio.h>
int main(int argc, const char * argv[]) {
char name[];
scanf("%10s",name);
printf("%s \n",name);
return ;
}
在运行中输入 ‘wuhanHangzShanghai’,打印结果
wuhanHangz
5 如果使用%s转换说名, scanf()会读取除空白以外的所有字符. scanf()跳过空白字符开始读取第一个字符非空白字符. 并保存非空白字符直到遇到空白字符. 这意味这scanf()根据%s转换说明读取i一个单词, 即不包含空白字符的字符串.
如果使用字段宽度, scanf() 在字段末尾或者第一个空白字符处停止读取. 无法利用字段宽度让只有一个%s的scanf()读取多个单词. 最后注意一点: 当scanf()把字符串放进指定数组中时, 它会在字符序列末尾加上‘\0’, 让数组中的内容成为一个C字符串.
6 scanf()的返回值
scanf()函数返回成功读取的项数. 如果没有读取到如何项, 且需要读取一个数字而用户却输入一个非数字字符串, scanf()返回0.
当scanf() 检测到‘文件结尾’时, 会返回EOF (EOF是stdio.h中定义的特殊值, 通常用#define 指令把EOF定义为-1)
示例三:
#include <stdio.h>
int main(int argc, const char * argv[]) {
int n1,n2,n3,m1,m2,s,num;
m1 = scanf("%d",&n1);
m2 = scanf("%d %d",&n2,&n3);
s = scanf("%d",&num);
printf("Enter number n1 = %d, n2 = %d, n3 = %d,num = %d\n",n1,n2,n3,num);
printf("scanf return m1 = %d, m2 = %d, s = %d\n",m1,m2,s);
return ;
}
输入‘12 45 678 string’, 打印结果
string
Enter number n1 = , n2 = , n3 = ,num =
scanf return m1 = , m2 = , s = 0
Program ended with exit code:
7 printf() 和 scanf() 的*修饰符
printf() 和 scanf() 都可以使用8修饰符来修改转换说明都含义. 但是, 他们都用法不太一样.
如果你不想预先设定指定字段宽度, 希望通过程序来指定, 那么可以用*修饰符代替字段宽度. 但还是要用一个参数告诉函数, 字段宽度应该是多少. 也就是说转换说明是%*d, 那么参数列表中应包含*和d对应都值. 这个技巧也可应用于浮点值指定精度和字段.
示例四:
#include <stdio.h>
int main(int argc, const char * argv[]) {
unsigned width,precision;
int number = ;
double weight = 242.5;
printf("Enter a field width:\n");
scanf("%d",&width);
printf("The number is :%*d\n",width,number);
printf("Now enter a width and a precision:\n");
scanf("%d %d",&width,&precision);
printf("Weight = %*.*f.\n",width,precision,weight);
printf("Done\n");
return ;
}
打印结果
Enter a field width:
12 // 输入
The number is :
Now enter a width and a precision:
6 // 输入
Weight = 242.500000.
Done
Program ended with exit code:
scanf()中的*用法与此不同, 把*放在%和转换说明符之间,会使得scanf()跳过相应的输出项.
示例五:
#include <stdio.h>
int main(int argc, const char * argv[]) {
int n;
printf("Please enter three integers:\n");
scanf("%*d %d %*d",&n);
printf("The last integer was %d\n",n);
return ;
}
打印结果
Please enter three integers:
12 23 45 // 输入
The last integer was 23
Program ended with exit code: 0
示例六
int main(int argc, const char * argv[]) {
int n;
printf("Please enter three integers:\n");
scanf("%*d %*d %d",&n);
printf("The last integer was %d\n",n);
return ;
}
打印结果
Please enter three integers:
967 // 输入
The last integer was
Program ended with exit code:
C语言scanf函数转换说明表及其修饰符表的更多相关文章
- C语言printf函数转换说明表及其修饰符表
请求printf()函数打印数据的指令要与打印数据的类型匹配. 例如, 打印整数时使用%d, 打印字符是使用%c. 这些符号被称为转换说明, 他们指定了数据转换称可显示的形式. 1. ANSI C标准 ...
- C语言scanf函数详细解释
原文链接 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准 ...
- 037——VUE中表单控件处理之表单修饰符:lazy/number/trim
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- vue 表单基本 表单修饰符
表单的基础 利用v-model进行双向数据绑定: 1.在下拉列表中,将v-model写在select中 2.单选框和复选框需要每个按钮都需要写上v-model 3.v-model在输入框中获取得是输入 ...
- C语言scanf函数详解
函数名: scanf 功 能: 运行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设 ...
- C语言scanf函数详细解释(转载)
原文地址:https://blog.csdn.net/21aspnet/article/details/174326 scanf 函数名: scanf 功 能: 执行格式化输入 用 法: int sc ...
- C语言Scanf函数
C语言的scanf函数 一.变量的内存分析 (一)字节与地址 ①. 内存以字节为单位 每个字节都有自己的内存地址,根据地址就可以找到该字节.整个内存相当于一整个酒店,而酒店以房间为单位,在这里每个房间 ...
- [转载]VS2012编译C语言scanf函数error的解决方法
在VS 2012 中编译 C 语言项目,如果使用了 scanf 函数,编译时便会提示如下错误: error C4996: 'scanf': This function or variable may ...
- C++ c++与C语言的区别(三目运算符,const修饰符)
//区别⑦:三目运算符(C++版本) #include<iostream> using namespace std; //三目运算符 C语言返回变量的值 C++语言是返回变量本身 void ...
随机推荐
- DAVID 进行 GO/KEGG 功能富集分析
何为功能富集分析? 功能富集分析是将基因或者蛋白列表分成多个部分,即将一堆基因进行分类,而这里的分类标准往往是按照基因的功能来限定的.换句话说,就是把一个基因列表中,具有相似功能的基因放到一起,并和生 ...
- Java高级开发_性能优化的细节
一.核心部分总结: 尽量在合适的场合使用单例[减负提高效率] 尽量避免随意使用静态变量[GC] 尽量重用对象,避免过多过常地创建Java对象[最大限度地重用对象] 尽量使用final修饰符[内联(in ...
- SQL2008R2下数据库修复一例
某天访问某个数据库的时候,系统报错.连上去看了一下,服务器是SQL2008R2.由于有上次修复的经验,先使用DBCC查看数据库情况. DBCC的返回: XXXXXXXXXXX发生异常数据库 ID 7, ...
- Idea 进行断点调试的 快捷键
快捷键 功能描述F8 单步调试,不进入函数内部F7 单步调试,进入函数内部Shift+F7 选择要进入的函数Shift+F8 跳出函数Alt+F9 运行到断点Alt+F8 执行表达式查看结果F9 继续 ...
- backend介绍
开发环境: windows python django 2.2 一个django 后台管理的app 将后台管理组件化, 不依赖于项目, 只要简单配置就可以使用, 开发业务逻辑也非常方便 其主要包含三个 ...
- AVLMap平衡二叉树
public class AVLMap<K, V> implements Iterable<AVLEntry<K, V>> { private int size; ...
- 『LCA 树链剖分』
LCA Description 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根 的距离+1. 设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公 ...
- Java的jdk环境变量配置
方法/步骤 1.安装JDK 选择安装目录 安装过程中会出现两次 安装提示 .第一次是安装 jdk ,第二次是安装 jre .建议两个都安装在同一个java文件夹中的不同文件夹中.(不能都安装在java ...
- 示例:自定义WPF底层控件UI库 HeBianGu.General.WpfControlLib V2.0版本
原文:示例:自定义WPF底层控件UI库 HeBianGu.General.WpfControlLib V2.0版本 一.目的:封装了一些控件到自定义的控件库中,方便快速开发 二.实现功能: 基本实现常 ...
- mybatis映射mapper文件做like模糊查询
方法:使用concat函数连接通配符