C Primer Plus学习笔记(三)- 字符串和格式化输入/输出
从一个简单的例子开始
#include <stdio.h> int main()
{
char name[10]; printf("Input Your Name:\n");
scanf("%s", name);
printf("Your Name is %s\n", name); return 0;
}
运行结果
C语言没有专门用于储存字符串的变量类型,字符串都被储存在char类型的数组中
数组由连续的存储单位组成,字符串中的字符被储存在相邻的存储单元中,每个单元储存一个字符
字符串末尾有个空字符\0,C语言用它标记字符串的结束,空字符是非打印字符,ASCII码值为0
C语言中的字符串一定以空字符结尾,所以数组的容量必须至少比待存储字符串中的字符数少1
如,声明一个20个存储单位的字符串,它只能存储19个字符,剩下一个字节留给空字符
编译器会在字符串末尾加上空字符
字符串和字符:
字符串用""括起来,字符用''括起来
字符是基本类型(char),字符串是派生类型(char 数组)
字符串由字符和空字符\0组成
strlen()函数:
string.h头文件中包含strlen()函数和其他多个与字符串相关的函数原型
strlen()函数给出字符串中的字符长度,不把空字符算入,但包括空格和标点符号,sizeof把字符串结尾的空字符也算入
strlen()函数占位符用%zd,如果编译器不识别%zd,就用%u或%lu
定义常量:
格式:#define 符号常量名 常量的值
#define NAME jack
末尾不用加分号
符号常量的命名规则和变量相同,常量名最好用大写
const限定符:
const关键字用于限定一个变量为只读,也就是只能使用,不能修改
const char name = 'Jack';
name变成了只读的变量
转换说明及其打印的输出结果
转换说明 | 输出 |
%a | 浮点数、十六进制数和p记数法(C99/C11) |
%A | 浮点数、十六进制数和p记数法(C99/C11) |
%c | 单个字符 |
%d | 有符号十进制整数 |
%e | 浮点数,e记数法 |
%E | 浮点数,e记数法 |
%f | 浮点数,十进制记数法 |
%g | 根据值的不同,自动选择%f或%e。%e格式用于指数小于-4或者大于或等于精度时 |
%G | 根据值的不同,自动选择%f或%E。%E格式用于指数小于-4或者大于或等于精度时 |
%i | 有符号十进制整数(和%d相同) |
%o | 无符号八进制整数 |
%p | 指针 |
%s | 字符串 |
%u | 无符号十进制整数 |
%x | 无符号十六进制整数,使用十六进制数0f |
%X | 无符号十六进制整数,使用十六进制数0F |
%% | 打印一个百分号 |
格式字符串中的转换说明一定要与后面的每个项相匹配
printf()中的标记
标记 | 含义 |
- | 待打印项左对齐 |
+ | 有符号值若为正,则在值前面显示加号;若为负,则在值前面显示减号 |
空格 | 有符号值若为正,则在值前面显示前导空格(不显示任何符号);若为负,则在值前面显示减号+标记覆盖一个空格 |
# | 把结果转换为另一种格式。如果是%o格式,则以0开始;如果是%x或%X格式,则以0x或0X开始;对于所有的浮点格式,#保证了即使后面没有任何数字,也打印一个小数点字符。对于%g和%G格式,#防止结果后面的0被删除 |
0 | 对于数值格式,用前导0代替空格填充字段宽度。对于整数格式,如果出现-标记或指定精度,则忽略该标记 |
示例
#include <stdio.h> int main()
{
char one_size = 'M';
int two_num = 13;
int three_num = -15;
int four_num = 124;
int five_num = 25; printf("*%-20c*\n", one_size);
printf("*%+d*\n", two_num);
printf("*% d*\n", three_num);
printf("*%#x*\n", four_num);
printf("*%010d*\n", five_num); return 0;
}
运行结果
printf()的转换说明修饰符
修饰符 | 含义 |
标记 | 上表 |
数字 | 最小字段宽度,如果该字段不能容纳待打印的数字或字符串,系统会使用更宽的字段 |
.数字 |
精度。 对于%g和%G转换,表示有效数字最大位数 对于%s转换,表示待打印字符的最大数量 对于整型转换,表示待打印数字的最小位数 如有必要,使用前导0来达到这个位数 只使用.表示其后跟随一个0,所以%.f和%.0f相同 |
h | 和整型转换说明一起使用,表示short int或unsigned short int类型的值 |
hh | 和整型转换说明一起使用,表示signed char或unsigned char类型的值 |
j | 和整型转换说明一起使用,表示intmax_t或uintmax_t类型的值。这些类型定义在stdint.h中 |
l | 和整型转换说明一起使用,表示long int或unsigned long int类型的值 |
ll | 和整型转换说明一起使用,表示long long int或unsigned long long int类型的值 |
L | 和浮点转换说明一起使用,表示long double类型的值 |
t | 和整型转换说明一起使用,表示ptrdiff_t类型的值。ptrdiff_t是两个指针差值的类型 |
z | 和整型转换说明一起使用,表示size_t类型的值。size_t是sizeof返回的类型 |
对于浮点类型有用于double和long double类型的转换说明,却没有float类型的,这是因为无论在K&R C还是ANSI C,float类型被自动转换成double类型,所以都没有显示float类型值专用的转换说明
转换说明把以二进制格式储存在计算机中的值转换成一系列字符(字符串)以便于显示
printf()函数的返回值:
printf()函数也有一个返回值,它返回打印字符的个数
如果有输出错误,printf()则返回一个负值
#include <stdio.h> int main(void)
{
int rev;
rev = printf("Hello World!\n");
printf("%d\n", rev); return 0;
}
运行结果
参数传递:
程序把传入的值放入被称为栈的内存区域
计算机根据变量类型(不是根据转换说明)把这些值放入栈中
printf()函数根据转换说明(不是根据变量类型)从栈中读取值
scanf()函数:
如果用scanf()读取基本变量类型的值,在变量名前加上一个&
如果用scanf()把字符串读入字符数组中,不用&
从scanf()角度看输入:
如果scanf()使用%d转换说明读取一个整数,scanf()函数每次读取一个字符,跳过所有的空白字符,直到遇到第1个非空白字符才开始读取
scanf()函数如果找到一个数字或符号(+或-),它便保存该字符,并读取下一个字符。
如果下一个字符是数字,它就保存该字符并读取下一个字符。
scanf()会不断地读取和保存字符,直到遇到非数字字符。
如果遇到非数字符号,scanf()就认为读到了整数的末尾。
然后,scanf()就把非数字字符放回输入,程序在下一次读取输入的时候,首先会读取丢弃的非数字字符。
最后,scanf()计算已读取数字(可能还有符号)相应的数值,并将计算后的值放入指定的变量中
如果使用字段宽度,scanf()会在字段结尾或第一个空白字符处停止读取
使用%s转换说明,scanf()只能读取一个不包含空白字符的单词,无法利用字段宽度让只有一个%s的scanf()读取多个单词
当scanf()把字符串放进指定数组中时,它会在字符序列的末尾加上空字符\0,让数组中的内容成为一个C字符串
scanf()函数所用的转换说明与printf()函数几乎相同。主要区别是,对于float类型和double类型,printf()都使用%f,%e,%E,%g和%G转换说明,而scanf()只把它们用于float类型,对于double类型要使用l修饰符
scanf()的返回值:
scanf()函数返回成功读取的项数
如果没有读取任何项,且需要读取一个数字而用户却输入一个非数值字符串,scanf()便返回0
当scanf()检测到“文件结尾”时,会返回EOF(EOF是stdio.h中定义的特殊值,通常用#define指令把EOF定义为-1)
scanf()的*修饰符:
把*放在%和转换字符之间时,会使得scanf()跳过相应的输出项
#include <stdio.h> int main(void)
{
int n; printf("Input Three integers\n");
scanf("%*d, %*d, %d", &n);
printf("The Last Interger is %d\n", n); return 0;
}
运行结果
C Primer Plus学习笔记(三)- 字符串和格式化输入/输出的更多相关文章
- C Primer Plus 第4章 字符串和格式化输入/输出 编程练习
1. #include <stdio.h> int main(void) { ]; ]; printf("请输入您的名字: "); scanf("%s&quo ...
- 【C语言学习】《C Primer Plus》第4章 字符串和格式化输入/输出
学习总结 1.String str=”hello world!”;(Java),char[20]=” hello world!”;(C).其实Java字符串的实现,也是字符数组. 2.字符串的尾部都会 ...
- 重学C语言---04字符串和格式化输入/输出
1.程序示例 //talkback.c一个能为你提供一些信息的对话框 #include <stdio.h> #include <string.h> //提供strlen函数原型 ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- VSTO学习笔记(三) 开发Office 2010 64位COM加载项
原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...
- Java IO学习笔记三
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
- 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记
回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...
- angular学习笔记(三十一)-$location(2)
之前已经介绍了$location服务的基本用法:angular学习笔记(三十一)-$location(1). 这篇是上一篇的进阶,介绍$location的配置,兼容各版本浏览器,等. *注意,这里介绍 ...
- angular学习笔记(三十一)-$location(1)
本篇介绍angular中的$location服务的基本用法,下一篇介绍它的复杂的用法. $location服务的主要作用是用于获取当前url以及改变当前的url,并且存入历史记录. 一. 获取url的 ...
随机推荐
- QT 文本html显示格式的问题,如在QTextBrowser.setText用tr(),其中为html格式
QObject::tr("<h1><font color = green>%1</font>的人品指数:<font color = orange&g ...
- 常用的linux基础命令
常用的linux基础命令 1.ls 显示目录属性 -l:(也可以简写成ll),列表显示权限等属性 -a:显示所有文件包括隐藏文件等 -d:只列出目录本身 2.chgrp 改变档案所属群组 eg:chg ...
- XML DOM - Range 对象
Range对象 Range对象表示文档的连续范围区域,如用户在浏览器窗口中用鼠标拖动选中的区域. dom标准Range对象 在IE中使用TextRange对象 range对象常用的建立方法在开发中 ...
- BEC translation exercise 7
在挑选时我们完全出自疏忽而漏过了这篇短文.In making the selection we passed this short piece by quite inadvertently. we l ...
- Linux 线程同步的三种方法(互斥锁、条件变量、信号量)
互斥锁 #include <cstdio> #include <cstdlib> #include <unistd.h> #include <pthread. ...
- bzoj5457 城市
一棵树,每个点有一个民族,和一个人数,求每个子树里最多的民族及其人数,如果一样,输出编号最小的 $n \leq 500000$ sol: 卡莫队的毒瘤题,需要 dsu on tree 大概就是 dfs ...
- Yii 利用layer删除数据
一.视图 <tr id="rm_<?php echo $v->category_id;?>"> <td><?php echo $v- ...
- Element header-row-style设置多个属性
方式1: 直接在标签上添加上属性值: <el-table :header-cell-style="{background:'#F3F4F7',color:'#555'}" & ...
- Python函数-delattr()
delattr(object, name) 作用: 删除object对象名为name的属性. 参数object:对象. 参数name:属性名称字符串. >>> class Perso ...
- python模块导入的问题
从模块导入函数时,通常可以使用 import somemodule 或者 from somemodule import somefunction 或者 from somemodule import s ...