一、初识字符串
1、定义的几种格式
和整型数组一样:int data[]={1,2,3,4,5}; char str[]={'h','e','l','l','o'};
之前我们学过数组名就等于地址,那么也可以通过指针的方式来定义char *pchar="hello";
#include <stdio.h>
int main(int argc,char *argv[]){
char a[]={'h','e','l','l','o'};
char b[]="hello";
char *pchar="hello";
for(int i=0;i<3;i++){
for(int j=0;j<5;j++){
if(i==0){
printf("%c ",a[j]);
}else if(i==1){
printf("%c ",b[j]);
}else{
printf("%c ",*(pchar+j));
}
}
}
return 0;
}
(1)定义的区别
int str[]="hello"; 和 int *pchar="hello";
str是字符串变量,定义后允许被修改;pchar是字符串常量,定义之后不允许被修改。
2、关于打印
(1)puts
#include <stdio.h>
int puts(const char *str);//puts 函数用于输出一个字符串到标准输出设备,并且在输出结束后自动换行。
(2)printf("%s"
printf("%s\n",b);//%s 格式说明符用于输出一个以空字符 \0 结尾的字符串。
a
是一个字符数组,而 b
是一个字符串字面量。两者的区别在于 b
自动包含一个空字符 \0
作为终止符
但是使用 printf("%s ",a); 这个打印a[]时会出现错误:将 a
数组作为字符串来打印。a
是一个字符数组,其中包含了 'h'
, 'e'
, 'l'
, 'l'
, 'o'
这些字符。然而,%s
格式说明符期望的是一个以空字符 \0
结尾的字符串。由于 a
数组没有显式地以空字符结尾,当 printf
遇到 %s
格式说明符时,它会一直读取字符直到遇到第一个空字符或者直到超出数组范围为止。在这种情况下,由于 a
数组没有以 \0
结尾,printf
可能会继续读取内存中 a
数组之后的数据,导致不确定的行为。为了确保 a
能够正确地作为字符串打印,需要在数组末尾添加一个空字符 \0。
同样尝试将 b
数组作为字符串来打印。b
是一个字符串字面量,它的类型是 char[6]
(包括空字符 \0
)。字符串字面量自动以空字符结束,因此 b
的内容实际上是 'h', 'e', 'l', 'l', 'o', '\0'
。
(3)putchar
putchar
函数只能输出单个字符。
int putchar(int character);//character 是一个整数,表示要输出的字符的 ASCII 值。
#include <stdio.h>
int main() {
char a[] = {'h', 'e', 'l', 'l', 'o', '\0'}; // 字符数组,包含终止符
char b[] = "hello"; // 字符串字面量
for (int i = 0; a[i] != '\0'; ++i) {
putchar(a[i]); // 逐个输出 a 的字符
}
putchar('\n'); // 输出换行符
for (int i = 0; b[i] != '\0'; ++i) {
putchar(b[i]); // 逐个输出 b 的字符
}
putchar('\n'); // 输出换行符
return 0;
}
3、字符数组和字符串的长度
字符串带有结束标志 '\0' 所以b
的内容实际上是 'h', 'e', 'l', 'l', 'o', '\0'
。C语言<string.h>里面的函数操作字符串都会检测结束标志 '\0'
#include <stdio.h>
int main(int argc,char *argv[]){
char a[]={'h','e','l','l','o'};
char b[]="hello";
char *pchar="hello";
printf("pchar:%s\n",pchar);
printf("b:%s\n",b);
int len1=sizeof(a)/sizeof(a[0]);//建议用a[0]替换char,假设我们不知道类型
int len2=sizeof(b)/sizeof(b[0]);
printf("len1:%d\n",len1);
printf("len2:%d\n",len2);
return 0;
}