零字符与空字符
零字符:'0'
,ASCII码值为48。
空字符:\0
,ASCII码值为0。
字符串与char *
字符串"abc"是作为有四个字符的数组来存储的:(a、b、c 和 \0)
既然字符串以数组形式存储,那么编译器会将其视作char *
类型的指针。例如:
printf("abc")
当调用printf
时,它接受char *
类型的值作为它的第一个参数,其传递的其实是"abc"
的地址(指向存储a
的内存单元的指针)。
另一个例子:
char *p;
p = "abc";
这里的赋值操作不是复制 "abc" 中的字符,而是使 p 指向字符串的第一个字符。
注意:声明为字符指针的话就不可以修改字符串的内容了!
字符数组与字符串
只要确保字符串以空字符'\0'
结尾并且能完整放进数组内,那么字符数组就可以用于存储字符串。
声明字符数组的惯用法:
#define STR_LEN 20
...
char str[STR_LEN+1]
这是为了强调字符串最多能存储 STR_LEN 个有效字符。
另一方面,对于字符数组而言,可以使用=
来初始化,但是不可以用=
来赋值:
char str1[10];
str1 = "abc"; // 不合法!!
char str2[10] = "abc"; // 合法!
写字符串
可以使用printf
和puts
两种方式:
char str[] = "hello, world!";
printf("%s", str);
puts(str);
其中puts
总会添加一个额外的换行符。
读字符串
使用scanf
:
scanf("%s", str);
由于str
是数组名,因此编译器在将其传给函数时会当做指针来处理。
调用时,scanf
函数会跳过空白字符,读入字符并存储到str
中,直到遇到空白字符为止。并且,它始终会在字符串末尾存储一个空字符。
也就是说,用scanf
读入字符串永远不会包含空白字符。
使用gets
:
注意点:
gets
函数不会在开始读字符串之前跳过空白字符。gets
函数会持续读入,直到找到换行符再停止。(scanf
是任意空白字符)。
参差不齐的字符串数组
“字符串数组”与“字符数组”是完全不同的两个概念。
字符串数组中存储的是不同的字符串,例如:
char [][8] = {"earth", "and", "jupyter"};
二维数组可以忽略行数,但不能忽略列数。
这样存储会浪费内存,因为未填满列宽的部分会填充\0
。
指向字符串指针的数组
char *planets[] = {"Earth", "Venus", "Mars"};
printf("%c", planets[0][1]);
这里 planets 中的每一个元素都是指向以空字符结尾的字符串的指针,可通过下标进行访问。
2024年9月22日 21:42
叼茂SEO.bfbikes.com