文章目录
字符串和格式化输入/输出
字符串(What)
char类型数组和null字符
strlen()函数
常量和C预处理器
const常量
明示常量
整数常量
浮点常量
字符常量
printf()&scanf()
printf打印函数
scanf输入函数
字符串和格式化输入/输出
主要学习输入输出。C语言的两个输入输出函数:printf()和scanf()。
学会使用这两个函数,不仅能实现与用户的交互,还可以根据个人喜好和任务要求格式化输出。
最后,一个重要的工具——C预处理指令,并学会如何定义及使用
字符串(What)
字符串是一个或多个字符的序列。
例如 字符串"Liusen is a handsome boy" 字符:‘a’
双引号不是字符串的一部分。双引号仅告诉编译器它括起来的是字符串,就好比单引号用来标识是一个字符是一个道理
char类型数组和null字符
C语言没有专门储存字符串的变量类型,字符串都被储存在char类型的数组里。
数组由连续的储存单元组成,字符串中的字符被储存在相邻的储存单元里,每个单元储存一个字符。
这个数组末尾的字符 \0 .这是空字符,C语言用它来标记字符串的结束,它是转义字符,其ASCII码值是0
C中的字符串一定以空字符结束,也就是说数组的大小必须至少要比将要储存的字符串中的字符数多1
就好比一个大小为10的数组,它可以储存9个字符,剩下的一个留给空字符用来标识字符串已经结束
什么是数组
可以把数组看作是一行连续的多个储存单元,更准确说,数组是同类型数据元素的有序序列
使用字符串
新上映的 *<<你好世界>>*不知道大家看了没,哈哈,我好像高三就看完了😂
#include <stdio.h> int main() { char name[20]; printf("请输入\n"); scanf("%s",name); printf("Hello,%s!",name); return 0; }
%s告诉printf()打印一个字符串
scanf()在读取输入时就已经把空字符放在了字符串末尾
字符和字符串
字符串常量"x"和字符常量’x’不同。区别之一在于’x’是基本类型(char),而"x"是派生类型(char数组);区别之二是"x"实际上由两个字符组成:'x’和空字符\0
strlen()函数
#include <string.h> string.h头文件包含多个与字符串相关的函数原型,包括strlen(). #include <stdio.h> #include <string.h> #define HE "I am zhouqiluo" int main() { char name[40]; printf("输入你的名字"); scanf("%s",name); printf("Hello,%s %s\n",name,HE); printf( "strlen is %zd and sizeof is %zd",strlen(name),sizeof name); return 0; }
常量和C预处理器
有时程序需要用到常量.比如计算⚪的周长
⚪的周长=Πd
int pi,sum; pi=3; sum=2*pi;
这叫符号常量,计算机会用实际值来完成替换
为什么使用符号常量更好?
常量名比数字表达的信息更多
假设程序多处使用一个常量,有时需要修改它的值.如果使用符号常量,只需要修改符号常量的值,反之,想想都头疼
如何创建符号常量?
方法1:先声明一个变量,然后将该变量设置为需要的常量
int sum; sum=3;
这样写有个问题,就是num是一个变量,程序可能会无意间改变它的值.
方法2:C还提供了一个更好的方案------C预处理器
C预处理器
预处理器也可以用来定义常量.只需要在程序顶部添加一行:
#define SUM 3
编译程序时,程序中的所有的sum都会被替换成3.这个过程被称为 编译时替换
这样定义的常量也叫做 明示常量
格式:#define 符号常量名 符号常量值(其中没有等号)
尾部不用加分号
为什么要用大写?
用大写表示符号常量是C语言一贯的传统,看到大写就明白这是一个符号变量,而非变量.
这并不影响程序的正常运行,只是我们应该养成大写常量的好习惯.
命名规则
符号常量的命名规则和变量相同
可以使用大小写字母,数字和下划线字符,首字母不能是数字.
const常量
C90新增了关键字const,用于限定一个变量为只读
const int sum = 12;//sum的值在程序中不可更改,使sum成为了一个只读值.
明示常量
C头文件limits.h和float.h分别提供了与整数类型和浮点类型大小限制相关的详细信息。每个头文件都定义了一系列供实现使用的明示常量 例如,limits.h头文件包含以下类似的代码:
#define INT_MAX +32767
#define INT_MIN -32768
这些明示常量代表int类型可表示的最大值和最小值。如果系统使用32位的int,该头文件会为这些明示常量提供不同的值。如果在程序中包含limits.h头文件,就可编写下面的代码:
printf(“Maximum int value on this system = %d\n”, INT_MAX);
类似地,float.h头文件中也定义一些明示常量,如FLT_DIG和DBL_DIG,分别表示float类型和double类型的有效数字位数。
整数常量
整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。
212 /* 合法的 */ 215u /* 合法的 */ 0xFeeL /* 合法的 */ 078 /* 非法的:8 不是八进制的数字 */ 032UU /* 非法的:不能重复后缀 */
85 /* 十进制 */ 0213 /* 八进制 */ 0x4b /* 十六进制 */ 30 /* 整数 */ 30u /* 无符号整数 */ 30l /* 长整数 */ 30ul /* 无符号长整数 */
浮点常量
浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。
当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。当使用指数形式表示时, 必须包含小数点、指数,或同时包含两者。带符号的指数是用 e 或 E 引入的。
下面列举几个浮点常量的实例:
3.14159 /* 合法的 */ 314159E-5L /* 合法的 */ 510E /* 非法的:不完整的指数 */ 210f /* 非法的:没有小数或指数 */ .e55 /* 非法的:缺少整数或分数 */
字符常量
字符常量是括在单引号中,例如,‘x’ 可以存储在 char 类型的简单变量中。
字符常量可以是一个普通的字符(例如 ‘x’)、一个转义序列(例如 ‘\t’),或一个通用的字符(例如 ‘\u02C0’)。
在 C 中,有一些特定的字符,当它们前面有反斜杠时,它们就具有特殊的含义,被用来表示如换行符(\n)或制表符(\t)等。下表列出了一些这样的转义序列码:
转义序列 含义
\ \ 字符
’ ’ 字符
" " 字符
? ? 字符
\a 警报铃声
\b 退格键
\f 换页符
\n 换行符
\r 回车
\t 水平制表符
\v 垂直制表符
\ooo 一到三位的八进制数
\xhh . . . 一个或多个数字的十六进制数
printf()&scanf()
这两个函数的使用能使程序更好的与用户交流,他们是输入/输出函数,简称I/O函数
printf打印函数
请求printf()函数打印数据的指令要与待打印数据的类型相匹配.
下面是格式转换说明
flags(标识) 描述
- 在给定的字段宽度内左对齐,默认是右对齐(参见 width 子说明符)。
+ 强制在结果之前显示加号或减号(+ 或 -),即正数前面会显示 + 号。默认情况下,只有负数前面会显示一个 - 号。
空格 如果没有写入任何符号,则在该值前面插入一个空格。
# 与 o、x 或 X 说明符一起使用时,非零值前面会分别显示 0、0x 或 0X。 与 e、E 和 f 一起使用时,会强制输出包含一个小数点,即使后边没有数字时也会显示小数点。默认情况下,如果后边没有数字时候,不会显示显示小数点。 与 g 或 G 一起使用时,结果与使用 e 或 E 时相同,但是尾部的零不会被移除。
0 在指定填充 padding 的数字左边放置零(0),而不是空格(参见 width 子说明符)。
width(宽度) 描述
(number) 要输出的字符的最小数目。如果输出的值短于该数,结果会用空格填充。如果输出的值长于该数,结果不会被截断。
* 宽度在 format 字符串中未指定,但是会作为附加整数值参数放置于要被格式化的参数之前。
.precision(精度) 描述
.number 对于整数说明符(d、i、o、u、x、X):precision 指定了要写入的数字的最小位数。如果写入的值短于该数,结果会用前导零来填充。如果写入的值长于该数,结果不会被截断。精度为 0 意味着不写入任何字符。 对于 e、E 和 f 说明符:要在小数点后输出的小数位数。 对于 g 和 G 说明符:要输出的最大有效位数。 对于 s: 要输出的最大字符数。默认情况下,所有字符都会被输出,直到遇到末尾的空字符。 对于 c 类型:没有任何影响。 当未指定任何精度时,默认为 1。如果指定时不带有一个显式值,则假定为 0。
.* 精度在 format 字符串中未指定,但是会作为附加整数值参数放置于要被格式化的参数之前。
length(长度) 描述
h 参数被解释为短整型或无符号短整型(仅适用于整数说明符:i、d、o、u、x 和 X)。
l 参数被解释为长整型或无符号长整型,适用于整数说明符(i、d、o、u、x 和 X)及说明符 c(表示一个宽字符)和 s(表示宽字符字符串)。
L 参数被解释为长双精度型(仅适用于浮点数说明符:e、E、f、g 和 G)。
实例
#include<stdio.h> int main(){ int a=8; printf("我的小孩小张%d岁了",a); return 0; }
注意:格式字符串中的转换说明一定要与后面的每个项匹配
#include <stdio.h> int main () { int ch; for( ch = 75 ; ch <= 80; ch++ ) { printf("ASCII 值 = %d, 字符 = %c\n", ch , ch ); } return(0); }
#include <stdio.h> int main() { char ch = 'A'; char str[20] = "www.runoob.com"; float flt = 10.234; int no = 150; double dbl = 20.123456; printf("字符为 %c \n", ch); printf("字符串为 %s \n" , str); printf("浮点数为 %f \n", flt); printf("整数为 %d\n" , no); printf("双精度值为 %lf \n", dbl); printf("八进制值为 %o \n", no); printf("十六进制值为 %x \n", no); return 0; }
scanf输入函数
scanf 类型说明符:
类型 合格的输入 参数的类型
%a、%A 读入一个浮点值(仅 C99 有效)。 float *
%c 单个字符:读取下一个字符。如果指定了一个不为 1 的宽度 width,函数会读取
width 个字符,并通过参数传递,把它们存储在数组中连续位置。在末尾不会追加空字符。 char *
%d 十进制整数:数字前面的 + 或 - 号是可选的。 int *
%e、%E、%f、%F、%g、%G 浮点数:包含了一个小数点、一个可选的前置符号 + 或 -、一个可选的后置字符 e 或 E,以及一个十进制数字。两个有效的实例 -732.103 和
7.12e4 float *
%i 读入十进制,八进制,十六进制整数 。 int *
%o 八进制整数。 int *
%s 字符串。这将读取连续字符,直到遇到一个空格字符(空格字符可以是空白、换行和制表符)。 char *
%u 无符号的十进制整数。 unsigned int *
%x、%X 十六进制整数。 int *
%p 读入一个指针 。
%[] 扫描字符集合 。
%% 读 % 符号。
#include<stdio.h> int main(void) { int a,b,c; printf("请输入三个数字:"); scanf("%d%d%d",&a,&b,&c); printf("%d,%d,%d\n",a,b,c); return 0; }
说明
1、&a、&b、&c 中的 & 是地址运算符,分别获得这三个变量的内存地址。
2、%d%d%d 是按十进值格式输入三个数值。输入时,在两个数据之间可以用一个或多个空格、tab 键、回车键分隔。
如果使用 , 来分隔输入的 %d, 相应的输入时也需要添加 ,: