1.字符串与字符数组
字符:用单引号包括一个字符,如:"a","1"
字符数组:字符类型的数组,如:char arr[10];
字符串:用双引号包括字符序列,可以是0个或者多个字符序列,如:"abcd","1234ab"
注意:字符串有一个隐藏的"\0"作为结尾标记,在定义数组时注意长度问题
注意:如果字符数组包含"\0"那么它也是字符串,如果字符数组不包含”\0"它就不是字符串
int main()
{
char str1[10]; //字符数组,不是字符串
char str2[5] = { 'a','b','c','d','e' };//字符数组,不是字符串
//char str3[5] = { 'a','b','c','d','e','f'};//错误
char str4[] = { 'a','b','c','d','e' };//自动推导,能保存同时最节约,//字符数组,不是字符串
char str5[5] = { 'a' };//后面4个0,//字符数组,是字符串
//输出str4(把它当作一个普通的数组,利用循环处理)
//for (int i = 0; i < sizeof(str4) / sizeof(str4[0]); i++)
// printf("%c",str4[i]);//输出一个字符
//和普通数组不同的地方
char str6[5] = { "abcd" }; //字符数组,是字符串
char str7[5] = "abcd"; //字符数组,是字符串
//char str8[5] = "abcde";//错误
const char* str9 = "hello world";//不是字符数组,是字符串,字符串常量
printf("%s\n",str1);//不是字符串,输出出错
printf("%s\n", str2);//不是字符串,输出出错
printf("%s\n", str4);//不是字符串,输出出错
printf("%s\n", str5);//是字符串
printf("%s\n", str6);//是字符串
printf("%s\n", str7);//是字符串
printf("%s\n", str9);//是字符串
return 0;
}
2. 0在C语言中的表现
0:0,'\0',false,NULL都是0
int main()
{
printf("%d,%d,%d,%d\n",0,'\0',false,NULL);
return 0;
}
程序执行如下:
3.字符串的赋值
main()
{
char str1[7];
char str2[10] = "abcde";
char str3[10] = "xyz";
int i;
//把str2复制给str1
//str1 = str2 ;//错误的,数组不能整体复制
//for(int i=0;i<10;i++);//这种可能越界,不好,最好应该使用'\0'判断结尾
for (i = 0; str2[i] != '\0'; i++)
{
str1[i] = str2[i];
}
str1[i] = '\0';
//输出str1的内容
printf("%s\n", str1);
//把str3的内容连接在str2的后面
//找到str2的尾巴,然后把str3的内容复制到str2的尾巴后处
for (i = 0; str2[i] != '\0'; i++)
{
//空语言,目的就是找到放'\0'的str2数组
}
for (int j = 0; str3[j] != '\0'; j++, i++)
{
str2[i] = str3[j];
}
str2[i] = '\0';
printf("str2=%s\n", str2);
//通过str2[3] = '\0'; //将str2数组的长度变为3,因此我们可以通过'\0'作为条件找到字符数组长度
for (i = 0; str2[i] != '\0'; i++)
{
//空
}
printf("%d\n", i);
return 0;
}
程序执行如下:
4.sizeof和strlen的区别
sizeof:求后面内容的字节数
strlen:求字符串的有效长度,不包含'\0'
int main()
{
//printf("%llu\n",strlen(str1));//%u:输出无符号int
char str1[100] = "abcde";
char str2[] = "abcde";
char str3[100] = "abcd\0ef";
char str4[] = "abcd\0ef";
printf("%u,%u\n", sizeof(str1), strlen(str1));//100,5
printf("%u,%u\n", sizeof(str2), strlen(str2));//6,5
printf("%u,%u\n", sizeof(str3), strlen(str3));//100,4
printf("%u,%u\n", sizeof(str4), strlen(str4));//8,4
printf("%u\n", sizeof(int));//4
//printf("%llu\n",strlen(int));//错误
printf("%u\n", sizeof(12.3));//8 ,double
//printf("%llu\n",strlen(12.3));//错误
return 0;
}
5.字符串库函数:字符串是一个集合必须使用相应的函数进行处理
strcpy:字符串拷贝,注意要求目标字符数组的容量一点更要足够,否则会越界
strcat:字符串连结,把后面的字符串连接到前面的字符串的后面,注意要求目标字符数组的容量一定要足够,否则会越界
strlen:字符串的长度,字符的数量不包括"\0",例如:"abcd" --->3
strcmp:字符串比较,注意字符串不能用"<",">"或者"=="进行比较
strstr:在字符串1中查找字符串2,成功返回找到的地址,失败返回NULL
strcpy的使用
int main()
{
char str1[100];
char str2[] = "abcde";
strcpy(str1, str2);//把str2的字符串拷贝到str1中
printf("str1=%s\n", str1);
strcpy(str1, "hello world");//str1原来的内容会被覆盖
printf("str1=%s\n", str1);
char str3[10];
strcpy(str3, "hello world");//str3越界,strcpy:要求目标字符数组的容量一点要足够
printf("str3=%s\n", str3);
return 0;
}
strcat的使用
int main()
{
char str1[100] = "xyz";
char str2[] = "abcde";
strcat(str1,str2);
printf("str1=%s\n",str1);
//常见的错误
/*char str3[10];//str3不是字符串
strcat(str3, str2);
printf("str3=%s\n", str3);*/
//char str4[] = "xyz"; //越界,str4的长度不够继续存放str2的内容
//strcat(str4, str2);
//printf("str4=%s\n", str4);
//strcat("xyz","abcde");//错误,"xyz"是一个字符串常量,不允许修改
}
strlen的使用
int mian()
{
char str1[] = "abcde";
const char* str2 = "xyz";
char str3[] = "abcd\0ef\nxyz";
printf("%d,%d,%d\n", strlen(str1), strlen(str2), strlen(str3));
return 0;
}
strcmp的比较使用
int main()
{
const char* str1 = "abc";
//const char* str2 = "x";
//const char* str2 = "abb";
//const char* str2 = "abc";
char str2[] = "xyz";
int n1 = strcmp(str1,str2);
if (n1 > 0)
printf("%s > %s\n",str1,str2);
else if(n1 == 0)
printf("%s == %s\n", str1, str2);
else
printf("%s < %s\n", str1, str2);
return 0;
}
strstr字符串查找的使用
int main()
{
const char* str1 = "abcabcdabcde";
const char* str2 = "abcd";
const char *p = strstr(str1,str2);//返回第一个str2的指针地址
if (p == NULL)
printf("%s中没有%s\n",str1,str2);
else
printf("p=%s\n",p);
p = strstr(p+1,str2);
if (p == NULL)
printf("%s中没有%s\n", str1, str2);
else
printf("p=%s\n", p);
return 0;
}
字符串常量和字符串数组
int main()
{
//char* str1 = "hello world";//语法错误
char str2[] = "hello world";//字符数组,字符串
const char* str3 = "hello world";//字符串常量,str3是指针,在x86是4字节
str2[0] = 'x';//可以
//str3[0] = 'x';//语法错误
return 0;
}