char类型数组
字符串,由一个或多个字符组成的序列就做字符串。双引号不是字符串的一部分,只是告诉双引号里的内容是字符串,C语言中没有专门储存字符串的变量类型,字符串都被存储在char类型的数组中。数组由连续的储存单元组成,可以把数组看作是一行连续的多个存在的存储单元,数组是同类型数据元素的有序序列。数组末尾位置的字符\0,这是空字符,C语言用它标记字符的结束,不是数字0,为非打印字符,其ascii码值为0
I am a I 储存
I | a | m | I | \0 |
每个单元存储一个字节 标记字符的结束
char a 分1个字节 char a[5] 分5个字节
使用字符串
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define a "aaa"
int main(void) {
char name[20];
printf("what's your name?\n");
scanf("%s",name);
printf("hello, %s %s\n",name,a);
return 0;
}
将scanf换成scanf_s会出现打印不出来
#define用这样一句话定义了一个字符常量,不需要在字符串末尾加上\0,也就是空字符,编译器会默认加上。scanf函数只读取了1 1中的第一个1,在遇到空白(空格,制表符或换行符)就停止读取,%s转换说明是打印字符串的,scanf函数值会读取字符串中的第一个单词,而不是整句话。
strlen()函数
一般而言,C把函数库的相关函数归为一类,并为每类函数提供一个头文件。
strlen函数给出了字符串中的字符长度,sizeof函数是以字节为单位给出对象的大小
string.h头文件包含了多个与字符相关的符号,包括strlen函数,%zd的转换说明用来打印sizeof和strlen。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#define a "aaa"
int main(void) {
char name[40];
int b;
printf("what's your name?\n");
scanf("%s",name);
printf("%s %s\n",name,a);
printf("%zd 55 %zd\n", sizeof(name), strlen(name));
printf("%zd 55 %zd\n", sizeof(a), strlen(a));
return 0;
}
sizeof和strlen函数输出的结果不一样
对于常量a来说,strlen函数得出的也是字符串中的字符数(包括空格和标点函数),sizeof把末尾的不可见的空字符也计算在内了
sizeof函数可以不用括号,sizeof 22,使用圆括号时取决于运算对象是类型还是特定量(有值或无值的变量)。运算对象时时类型(变量类型,int,float,char)时,圆括号不能少,如sizeof(float);时特定量时,可有可无,一般建议使用圆括号。
printf修饰符
- 左对齐,从左侧开始打印
+ 有符号值,为正加+,为负加-
空格 有符号值为正,加前导空格,为负加前导-
# 把结果转换成另一种形式
0 0代替空格填充字符宽度
转换说明不匹配会造成数据读取出错,参数传递机制,如下
printf("%ld %ld %ld\n",n1,n2,n3)
该调用告诉计算机把变量n1,n2,n3的值传递给程序。这是一种常见的参数传递方式。计算机根据变量类型把这些值放到栈中。程序把传入的值放入被称为栈的内存区域。printf根据转换说明从栈中读取值。当转换说明不匹配时,会造成读取数据不是赋值的值
打印较长的字符串
3种方法 使用多种printf语句
使用\和enter键组合换行
ANSI C 引入的字符串连接
使用scanf()
读取数据时两种情况 ,需要加&(读取变量),不需要加&(字符串数组)
scanf空白字符,使用%s读取一个单词时,无法利用字符宽度读取多个单词,使用字符宽度时,读到字段末尾,或第一个空白字符就停止读取