首页 学习区

零字符与空字符

零字符:'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"; // 合法! 

写字符串

可以使用printfputs两种方式:

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 中的每一个元素都是指向以空字符结尾的字符串的指针,可通过下标进行访问。




文章评论

目录