C中字符串概念
字符串 是有序字符的集合(是程序中基本元素之一)
C语言中没有字符串的概念
C语言中通过特殊的字符数组模拟字符串(特殊的字符数组是有 \0 作为结尾)
C语言中字符串都是以 \0 结尾的的字符数组
'\0' 介绍:
'\0'是 ASCII 码表中的第 0 个字符,英文称为 NUL,中文称为“空字符”。该字符既不能显示,也没有控制功能,输出该字符不会有任何效果,它在C语言中唯一的作用就是作为字符串结束标志。
特殊的字面量 就是 字符串字面量。 本质为字符数组,而且是无名数组(数组里面的内容为字符)
问题:判断那些是字符串的定义?
char ca[] = {'H', 'e', 'l', 'l', 'o'};
char sa[] = {'H', 'e', 'l', 'l', 'o', '\0'};
char ss[] = "Hello world!";
char* str = "Hello world!";
分析:
char ca[] = {'H', 'e', 'l', 'l', 'o'};
ca是字符数组,不是字符串,因为末尾没有 ‘\0’
char sa[] = {'W', 'o', 'r', 'l', 'd', '\0'};
sa是字符串,末尾有 ‘\0’
Char ss[] = “Helloworld!” //“Helloworld!”为字符串字面量
这个一开始认为是用一个字符串字面量(本质是字符数组)去初始化ss字符数组,这个是C语言中特列的地方,可以用字符串字面量来初始化字符数组,被初始化的数组 是包涵每一个字符,并且编译后自动添加'\0',编译器编译的时候会在字符串字面量后面添加 '\0'。
char* str = "Hello world!";
用一个字符指针去指向字符串(本质为字符数组)是合法的
#include <stdio.h>
int main()
{
char ca[] = {'H', 'e', 'l', 'l', 'o'};
char sa[] = {'W', 'o', 'r', 'l', 'd', '\0'};
char ss[] = "Hello world!";
char* str = "Hello world!";
printf("%s\n", ca);
printf("%s\n", sa);
printf("%s\n", ss);
printf("%s\n", str);
return 0;
}
运行结果:
如果字符串处理函数传进去的参数是字符数值会有问题。上面 ca 就是这个问题。
“Helloworld” 是一个无名数组
#include <stdio.h>
int main()
{
// 理解本质,下面这些操作就容易理解
char b = "abc"[0];
char c = *("123" + 1);
char t = *"";
printf("%c\n", b);
printf("%c\n", c);
printf("%d\n", t);
printf("%s\n", "Hello");
printf("%p\n", "World");
return 0;
}
字符串长度
#include <stdio.h>
#include <string.h>
int main()
{
char s[] = "Hello\0world";
int i = 0;
for(i=0; i<sizeof(s)/sizeof(char); i++)
{
printf("%c\n", s[i]); // 打印字符
}
printf("%s\n", s); // 打印字符串
printf( "%d\n", strlen(s) );
printf( "%d\n", strlen("123") );
return 0;
}
运行结果:
补充案列:
1.留意一个坑,字符数组只有在定义时才能将整个字符串一次性地赋值给它,一旦定义完了,就只能一个字符一个字符地赋值了。
char str[7];
str = "abc123"; //错误
//正确
str[0] = 'a'; str[1] = 'b'; str[2] = 'c';
str[3] = '1'; str[4] = '2'; str[5] = '3';
2.字符串和常量指针的一些问题
#include <stdio.h>
int main(){
char *str = "Hello World!"; // 常量指针,指向常量的指针,不能改变内容
str = "I love C!"; //正确,本身地址可以改变
str[3] = 'P'; //错误
return 0;
}
小结:
C语言中通过字符数组模拟字符串,字符串中使用 '\0' 作为结束符。
字符串的本质为字符数组(无名数组)。
字符串相关的函数都依赖于结束符 ‘\0’。