字符串和格式化输入\输出
字符串和格式化输入\输出
主要介绍两个输入\输出函数:printf()和scanf()。
简要介绍一个重要工具------C预处理器指令。
字符串简介
字符串是一个或多个字符的序列。如:
“This is a string.”
双引号不是字符串的一部分。双引号仅告知编译器他括起来的是字符串。
char 类型数组和null字符
C语言没有专门用于存储字符串的变量类型,字符串都被存储在char类型数组中,数组由连续的存储单元组成。
C语言用’\0’ 来标记字符串的结束。空字符不是数字0,它是非打印字符,其ASCII码值等价于0。
数组:可以把数组看成是一行连续的多个存储单元。更正是说法是,数组是同类型元素的有序序列。如:
使用字符串
#include<stdio.h>
#define PRAISE "You are an extraordinary being."
int main(void)
{
char name[40];
printf("What's your name? ");
scanf_s("%s", name, 40);
printf("Hello, %s. %s\n", name, PRAISE);
return 0;
}
运行结果
scanf()只读取了Shi,它遇到第一个空白(空格, 制表符或换行符)时就不再读取输入。
一般而言,根据%s转换说明, scanf()只会读取字符串中的一个单词,而不是一整句。
字符串和字符
字符串常量 " x "和字符常量 ‘x’ 不同。区别之一在于 ‘x’ 是基本类型(char), 而 “x” 是派生类型(char数组); 区别之二是 “x” 实际上是由两个字符组成:'x’和空字符 \0。
常量和C预处理器
有时, 在程序中要使用常量。如计算圆的周长:
C = 3.14159 * d;
3.14159代表常量pi。 这种情况使用符号常量会更好。
假设程序中的多处使用一个常量, 有时需要改变它的值,若使用符号常量, 则只需改动符号常量的定义,不用逐一更改。
如何使用:
#define PI 3.14159
编译程序时,程序中所有的PI都被替换成3.14159.这一过程被称为编译时替换。 通常,这样的定义的常量也成为明示常量。
const 限定符
C90标准新增了const 关键字,用于限定一个变量为只读。
如:const int MONTHS = 12;
这使得MONTHS在使用时只能打印MONTHS,但不能更改。
明示常量
C头文件limits.h和float.h中分别提供了整数类型和浮点类型大小限制相关的详细信息。每个头文件都提供了一系列明示常量。如:limits.h中包含类似代码:
#define INT_MAX +32767
#define INT_MIN -32767
limits.h中的一些明示常量
明示常量 | 含义 |
---|---|
CHAR_BIT | char类型的位数 |
CHAR_MAX | char类型的最大值 |
CHAR_MIN | char类型的最小值 |
SCHAR_MAX | signed char类型的最大值 |
: | : |
printf()和scanf()
printf()和scanf()函数能让用户与程序交流。
printf()函数
请求printf()函数打印数据的指令要与待打印数据的类型相匹配。
转换说明及其打印的输出结果
转换说明 | 输出 |
---|---|
%a/ %A | 浮点数,十六进制数和p计数法 |
%c | 单个字符 |
%d | 有符号十进制整数 |
%e / %E | 浮点数, e计数法 |
%f | 浮点数,十进制计数法 |
%g /%G | 根据值的不同,自动选择%f或%e。%e格式用于指数小于-4或者大于或等于精度时 |
%i | 有符号十进制整数(与%d相同) |
%o | 无符号八进制整数 |
%p | 指针 |
%s | 字符串 |
%u | 无符号十进制整数 |
%x/%X | 无符号十六进制整数,使用十六进制数0f(0F) |
%% | 打印一个百分号 |
使用printf()
如:
printf(“The %d contestants atr %f berry pies.\n”, number, pies);
注意
格式字符串中的转换说明一定要与后面的每一项相匹配。
printf()的转换说明修饰符
在%和转换字符之间加入修饰符可修饰基本的转换说明。
printf()的一些修饰符
修饰符 | 含义 |
---|---|
标记 | 可以不使用标记或使用多个标记,示例:"%-10d" |
数字 | 最小字段宽度 ,如果该字段不能容纳待打印的数字或字符串,系统会使用更宽的字段。示例:"%4d" |
精度 | |
对于%e,%E和%f转换,表示小数点右边数字的位数 | |
.数字 | |
对于%s转换,表示待打印字符的最大数量 | |
对于整型转换,表示待打印数字的最小位数 | |
h | 和整型转换说明一起使用, 表示short int 或unsigned short int 类型的值。示例:"%hu", “%hx”, “%6.4hd” |
l | 和整型转换说明一起使用,表示long int 或unsigned long int 类型的值。示例:"%ld","%8lu" |
z | 表示size_t类型的值。size_t是sizeof返回的类型。示例:"%zd","%12zd" |
printf()中的一些标记
标记 | 含义 |
---|---|
- | 待打印项左对齐。即从字段的最左侧开始打印该项 |
+ | 有符号值若为正, 则在值前面显示加号;若为负,则在值前面显示减号。示例:"%+6.2f" |
# | 把结果转换为另一种形式。如果是%o格式,则以0开始;如果是%x或%X格式,则以0x或0X开始;对于所有的浮点格式,#保证了即使后面没有任何数字,也打印一个小数点字符。对于%g和%G格式,#防止结果后面的0被删除。示例:"%#o","%#8.0f","%+#10.3e" |
0 | 对于数值格式,用前导0代替空格填充字段宽度。 |
转换说明的意义
转换可能会误导读者认为原始值被替换成转换后的值。实际上,转换说明是翻译说明,%d的意思是”把给定的值翻译成十进制整数文本并打印出来“。
转换不匹配
示例:如果把一个大于255的值转换为字符,例如当printf()使用%c打印365时,他只会看存储365的的最后一字节。这种截断相当于用一个整数除以256,保留其余数。该数字被解释成”以256为模“。
只截取一字节即后八位。
printf()的返回值
printf()的返回值是打印字符的个数。如果打印错误,会返回一个负值
#include<stdio.h>
int main(void)
{
int len;
len = printf("Today is 2021.7.4.\n");
printf("The printf() printed %d characters.\n", len);
return 0;
}
输出结果
打印较长的字符串时
给字符串断行有三种方法:
- 使用多个printf()语句
- ()和Enter组合。这使得光标移至下一行,而且字符串中不会包含换行符。
- 在两个用双引号括起来的字符串之间用空白隔开。
#include<stdio.h>
int main(void)
{
printf("Here is one way to print a");
printf("long string.\n");
printf("Here is another way to print a\
long string.\n");
printf("Here is the newest way to print a"
"long string.\n");
return 0;
}
使用scanf()
scanf()和printf()类似,主要区别是:printf()使用变量,常量和表达式,而scanf()函数使用指向变量的指针。
- 如果用scanf()读取基本变量类型的值,在变量前加上一个&;
- 如果用scanf()把字符读入字符数组中,不要用&。
scanf()的返回值
scanf()返回成功读取的项数。如果没有读取任何项,且需要读取一个数字而用户却输入一个非数字字符串, scanf()便会返回0。当scanf()检测到文件结尾时,会返回EOF(#define指令把EOF定义为-1)。
小结
- 字符串是一系列被视为一个处理单元的字符。在C语言中,字符串是以空字符结尾的一系列字符。
- 字符串常量是用双引号括起来的字符序列。
- C预处理器为预处理器指令查找源代码程序。#define指令可以创建明示常量,即代表常量的符号。
- 。。。
相关文章
- JS和vue文本框输入改变p标签的内容测试
- 用 Haskell 求解 ACM 竞赛题(2):变量及其输入
- NLP-预训练模型-2018:Bert【用于NLU】【“Masked LM”缺点:①预训练与微调不一致;②忽略了掩码位置间的依赖关系】【复杂度:O(n^2·d);n:输入序列长度(规定最长512)】
- C语言:输入字符,输出前后两字符及其ASCALL值!
- 【Rust】闭包-输入函数
- 面试题:输入字符串,字符个数,输出拆分结果
- Linuxc - 标准输入流、标准输出流、标准错误流
- 《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.1.3 组合输入/输出流过滤器
- 《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.4 对象输入/输出流与序列化
- 多输入通道和多输出通道
- 【C语言】switch应用:输入一个月份,输出2018年该月份有多少天
- 【C语言】字符串的输入和输出 (按%c格式符)
- 数据结构(C++版)实现顺序表的创建,输入,输出,插入,删除,取值
- EditText限制输入字符类型的几种方式
- git pull/push每次都需要输入密码问题
- Numpy(三)Numpy的输入和输出:loadtxt()函数
- 推荐4个实用的4~20mA输入/0~5V输出的I/V转换电路
- el-input的number类型里输入e、+、-符号返回值为空?
- linux git pull/push时提示输入账号密码之免除设置
- 模拟输入(ADC-A0)
- 从URL输入到页面展现到底发生什么?
- 3. 海思Hi3519A MPP从入门到精通(三 视频输入)
- golang学习一:Go语言开发环境,基础类型, fmt包的格式化输出输入,运算符
- 判断输入信息是否为空