第四章 字符串和格式化输入输出
-
使用字符数组(array)储存字符串
// 示例程序
#include <stdio.h>
#include <string.h> //提供strlen()函数的原型
int main() {
char name[50];
printf("输入名字\n");
scanf("%s", name);
printf("你的名字是:%s\n", name);
//sizeof查看容量
int size = sizeof name;
printf("数组容量size:%d\n", size);
//string.h中的strlen()函数,查看字符串长度
printf("字符串长度为%ld\n", strlen(name));
}
- 用字符数组(array)储存字符串,该数组在内存中占用连续的50个字节,每个字节存储一个字符。
- 使用 %s 做为输入输出的占位符,注意,在scanf中,name变量没有&前缀,而数字类型的变量有。
- 使用 string.h 中的 strlen() 函数获取字符串长度。
// 运行结果
输入名字
sunjian
你的名字是:sunjian
数组容量size:50
字符串长度为7
-
字符串简介
C语言没有专门用于储存字符串的变量类型,字符串都被储存在char类
型的数组中。数组由连续的存储单元组成,字符串中的字符被储存在相邻的
存储单元中,每个单元储存一个字符。
注意字符串最后一位的 \0 ,这是C语言标记字符串的结束,占用一个单元,所以长度为50的数组只能存储49个字符。数组的容量至少要比待存储的字符数多 1 位。
scanf在读取字符串时,遇到空白符(空格,制表符或换行符)就不再继续读取输入,例如输入Cris Paul, scanf("%s",name) 只会读取到Cris。C语言还有其他的输入函数可以读取字符串,后面会学习到。
注意定义字符和字符串的区别,字符是基本类型(char),字符串是派生类型(char 数组),区别如图。
sizeof() 函数返回的是该数组有多少个存储单元,strlen() 返回的是字符串的长度(不包含结束符 \0)。strlen() 知道在何处停止。
圆括号的使用时机否取决于运算对象是类型还是特定量?运算对象是类型时,圆括号必不可少,但是对于特定量,可有可无。也就是说,对于类型,应写成sizeof(char)或sizeof(float);对于特定量,可写成sizeof name或sizeof 6.28。尽管如此,还是建议所有情况下都使用圆括号,如sizeof(6.28)。
-
const 限定符
const限定符用于限定一个变量为只读(是只读变量,不是常量),const 用起来比 #define更加灵活。
const int MONTHS = 12; // MONTHS在程序中不可更改,值为12
- 明示常量
引入头文件<limits .h> ,输出INT_MAX和INT_MIN,可以查看当前系统下int 的最大值和最小值。
#include <stdio.h>
#include <limits.h>
int main() {
printf("int最大值是:%d",INT_MAX);
printf("int最小值是:%d",INT_MIN);
}
下面是在64位系统下的输出
int最大值是:2147483647
int最小值是:-2147483648
类似地,float.h头文件中也定义一些明示常量,如FLT_DIG和DBL_DIG,分别表示float类型和double类型的有效数字位数。表中所列都与float类型相关。把明示常量名中的FLT分别替换成DBL和LDBL,即可分别表示double和long double类型对应的明示常量(表中假设系统使用2的幂来表示浮点数)
- printf() 函数
printf的占位符如下:
注意:printf()函数使用%符号来标识转换说明,因此打印%符号就成了个问题。如果单独使用一个%符号,编译器会认为漏掉了一个转换字符。解决方法很简单,使用两个%符号就行了:
pc = 2*6;
printf(" %d%% \n", pc);
输出结果为 : 12% 。
下面是占位符的修饰符及含义:
下表为 printf() 中的标记
- scanf() 函数
- 如果使用scanf() 读取基本变量类型的值,在变量名前加上一个 & ;
- 如果使用scanf() 读取字符串,不使用 & 。
- scanf() 使用空白(换行符、制表符、空格)把输入分为多个字段(唯一例外的是 %c 会读取包含空白在内的每个字符)。
#include <stdio.h>
// 示例程序
int main() {
char name[100];
int age;
float weight;
printf("请输入你的姓名,年龄,体重\n");
scanf("%s %d %f", name,&age,&weight);
printf("所以,你的姓名是%s,年龄是%d,体重是%f\n",name,age,weight);
return 0;
}
//运行结果
请输入你的姓名,年龄,体重
sunjian 23 75.0
所以,你的姓名是sunjian,年龄是23,体重是75.000000
下表是scanf() 的转换说明