char a[10]; //一维字符数组 char b[5][10]; //二维字符数组 char c[20]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a','m'}; // 给部分数组元素赋值 char d[]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a', 'm' }; //对全体元素赋值时可以省去长度
C语言规定,可以将字符串直接赋值给字符数组,例如:
char str[30] = {"abcde"}; char str[30] = "abcde"; //这种形式更加简洁,实际开发中常用
但是,需要注意的是在C语言中"a"
相当于'a'
和'\0'
的组合
所以
char ch[3] = "ab"; //正确 char ch[3] = "abc";//不正确,报错
在C语言中,字符串总是以’\0’作为串的结束符。
比较如下语句
char ch[3] = {'a', 'b', 'c'}; //不报错,但是输出abc的后面会有乱码 char ch[3] = {'a', 'b'}; //不报错,但是输出ab的后面会有乱码 char ch[3] = {'a', 'b', '\0'}; //不报错,输出abc
发现,如果以数组形式手动的一个个字符地赋值,结束符\0
是不可缺少的。
补充:
用字符串给字符数组赋值时由于要添加结束符 ‘\0’,数组的长度要比字符串的长度(字符串长度不包括 ‘\0’)大1。例如:
char str[] = "C program";
该数组在内存中的实际存放情况为:
字符串长度为 9,数组长度为 10。
'\0'
是ASCII码表中的第0个字符,用NULL
表示,称为空字符。该字符既不能显示,也不是控制字符,输出该字符不会有任何效果,它在C语言中仅作为字符串的结束标志。运行如下程序
#include int main(){ int i; char str1[30] = "abcde"; char str2[] = "C Language"; char str3[30] = "You are a good\0 boy!"; printf("str1: %s\n", str1); printf("str2: %s\n", str2); printf("str3: %s\n", str3); return 0; }
输出
str1: abcde str2: C Language str3: You are a good
str1 和 str2 很好理解,编译器会在字符串最后自动添加 '\0'
,并且数组足够大,所以会输出整个字符串。对于 str3,由于字符串中间存在 '\0'
,printf() 扫描到这里就认为字符串结束了,所以不会输出后面的内容。