字符串的表示
字符串的两种定义形式:
char str1[] = "Hello World";
char *str2 = "Hello World";
C语言有两种表示字符串的方法,一种是字符数组,另一种是字符串常量,并使用一个指针指向该字符串常量。它们在内存中的存储位置不同,使得字符数组可以读取和修改,而字符串常量只能读取不能修改。
两种形式最根本的区别是在内存中的存储区域不一样,字符数组存储在全局数据区或栈区,第二种形式的字符串存储在常量区。全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限,而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。
内存权限的不同导致的一个明显结果就是,字符数组在定义后可以读取和修改每个字符,而对于第二种形式的字符串,一旦被定义后就只能读取不能修改,任何对它的赋值都是错误的。
在编程过程中如果只涉及到对字符串的读取,那么字符数组和字符串常量都能够满足要求;如果有写入(修改)操作,那么只能使用字符数组,不能使用字符串常量。
获取用户输入的字符串就是一个典型的写入操作,只能使用字符数组,不能使用字符串常量。
给字符数组赋值时,通常将字符串一次性地赋值(可以指明数组长度,也可以不指明),而不是一个字符一个字符地赋值。
字符数组只有在定义时才能将整个字符串一次性地赋值给它,一旦定义完了,就只能一个字符一个字符地赋值。
C语言规定,可以将字符串直接赋值给字符数组:
char str[] = {"Hello World"};
char str[] = "Hello World";
字符串的输入输出
输入:通过变量输入
输出:(1). 通过变量直接输出
(2). 通过变量输出:直接输出字符串%s、通过循环每次输出一个字符%c
字符串结束标志
在C语言中,字符串总是以'\0'作为结尾,所以'\0'也被称为字符串结束标志,或者字符串结束符。 '\0'是 ASCII 码表中的第 0 个字符,英文称为 NUL,中文称为“空字符”。该字符既不能显示,也没有控制功能,输出该字符不会有任何效果,它在C语言中唯一的作用就是作为字符串结束标志。
C语言在处理字符串时,会从前往后逐个扫描字符,一旦遇到'\0'就认为到达了字符串的末尾,就结束处理。'\0'至关重要,没有'\0'就意味着永远也到达不了字符串的结尾。
由" "包围的字符串会自动在末尾添加'\0'。"abc123"一共包含 6 个字符。
逐个字符地给数组赋值并不会自动添加'\0'。char str[] = {'a', 'b', 'c'};,数组 str 的长度为 3,而不是 4,因为最后没有'\0'。
当用字符数组存储字符串时,要特别注意'\0',要为'\0'留个位置;这意味着,字符数组的长度至少要比字符串的长度大 1。当字符串长度大于数组长度时,有些较老或者不严格的编译器并不会报错,甚至连警告都没有,这就为以后的错误埋下了伏笔,需要多多注意。
有些时候,程序的逻辑要求我们必须逐个字符地为数组赋值,这个时候就很容易遗忘字符串结束标志'\0'。要想避免这些问题的话,将数组的所有元素都初始化为“零”值,这样就能够从根本上避免问题。
char str[30]=0; //将所有元素都初始化为 0,或者说 '\0'