如何定义字符串
-
由于字符串是同一类型的数据组成的,并且是有序的,而数组就是用于存储同一类型的有序数据,所以可以用数组来存储字符串
-
但是字符串变量和普通的字符数组有一定区别
-
C 语言规定字符串必须以\0 结尾,(作为字符串的结束符号),所以字符串变量的元素个数比字符数组的元素个数多一个\0
-
int main(){ char str[] = "lnn"; printf("字符串有多长:%i\n",sizeof(str)); }
-
-
如何输出字符串变量
- %s的原理,从传入的地址开始逐个取出,直到遇到\0 为止
// %s的原理,从传入的地址开始逐个取出,直到遇到\0 为止
char str1[] = "sss";
char str2[] = {'a','b','c'};
printf("%s\n",str2); // abcsss
// 内存寻址从大到小,依次y取出 a,b,c,发现还不是\0,此时继续取,s,s,s,\0,发现有\0 此时结束取值
字符串初始化
char str3[] = "lnn";
char str4[] = {'a','b','\0'};
char str5[10] = {'b','c','d'}; // 这种方式也是对的,\0 的 ASCII 码值就是 0,所以是可以的
char str6[3] = {'b','c','d'}; // 这种就不是字符串了,因为字符串是以\0 结尾的
修改字符串的值
char str7[] = "abc";
printf("字符串 str7 没有修改之前的值:%s\n",str7);
str7[0] = 'z';
printf("看看字符串 str7 修改了么%s\n",str7);
如何输出字符串
// 如何输出字符串
// 1,使用 printf()的%s 占位符
// 优点:可以自定义格式输出,
// 缺点:必须手动加上\n 才能换行
char str8[] = "abc";
printf("%s\n",str2);
// 2,使用puts()
// 优点:自动换行
// 缺点:不可以自定义格式 ,只能原样输出
puts(str8);
如何输入字符串
// 如何输入字符串
// 1,使用 scanf 接收
// 注意点:scanf 函数接收字符串,是以空格,tab,回车作为结束符号,也就是 scanf接收字符串时不能出现空格,tab,回车.比如输入 lnn lnn,此时只会输出 lnn,空格后面的都接收不到了
/*
printf("请输入您要输入的字符串,已回车结束\n");
char str9[10];
scanf("%s",str9);// 此处不用写取地址符号&,因为数组名就是数组的地址,就是数组第 o 个元素的地址
printf("str9 = %s\n",str9);
*/
// 使用 gets接收字符串
// warning: this program uses gets(), which is unsafe.--->指的是这是一个不安全的
// 1,定义的一个字符串最多存储 10 个字符,如果输入的多了就会报错了
// 2,如果输入10 个字符但是并没有\0,那么这还不是一个字符串,也是不安全的
// 优点:利用 gets 可以直接输入空格,tab,回车
/*
printf("请输入您要输入的字符串,已回车结束\n");
char str10[10];
gets(str10);
printf("str10 = %s\n",str10);
*/
如何计算字符串的长度
// 如何字符串的长度
char value[] = "wahaha,zhenhaohe";
// int leight = sizeof(value) / sizeof(value[0]) - 1; //不包含\0,\0没啥用
size_t leight = strlen(value); // 计算的字符串长度不包含\0
printf("字符串长度:%i\n",leight);
for (int i=0; i < leight; i++) {
printf("value[%i] = %c\n",i,value[i]);
}
// strlen 的原理,从传入的地址逐个取出字符串,没取出一个就让计数器加 1,直到遇到\0 位置
字符串的拼接
// 字符串的拼接strcat
char value1[10] = "lnn";
char value2[10] = "mmm";
strcat(value1, value2);
printf("拼接之后的 value1 是:%s\n",value1); // lnn mmm
// 注意,要想使用字符串拼接函数,那么dest 必须是一个数组,并且这个数组的长度必须要大于拼接之后的长度,如果数组的长度不能完全存放拼接后的长度就会报错.
// 字符串拼接 strncat char*,char*,size_t
// size_t 就是指定要拼接几个字符
// 如何动态计算最多可以拼接几个字符?,数组总长度-目前字符串长度
size_t size = sizeof(value1) / sizeof(value1[0]) - strlen(value1)-1;
printf("还能拼接%lu\n",size);
strncat(value1, value2, 1); // 指定拼接几个字符
strncat(value1, value2, size); // 动态计算还能拼接几个字符
printf("拼接之后的 value1 是:%s\n",value1); //此时指定拼接 value2 中的一个字符
字符串拷贝
// 字符串的拷贝strcpy
char value1[10] = "lnn";
char value2[10] = "mmm";
// printf("拷贝前 value1 的值:%s\n",value1); // lnn
// strcpy(value1, value2);
// printf("拷贝后 value1 的值:%s\n",value1); // mmm
// 注意拷贝的数组不能比原数组长,否则报错
// 字符串的拷贝 strncpy
strncpy(value1, value2, 1);
printf("拷贝后 value1 的值:%s\n",value1);
printf("拷贝后 value2 的值:%s\n",value2);
// 注意拷贝操作是逐个替换,我现在只拷贝了一个也就是 value2 字符串中的 m,替换掉了 value1 字符串的 l,其余的还是没有变的
// 动态计算能拷贝几个值
size_t size = sizeof(value1) / sizeof(value1[0]) -1; // 减去 1 是为了\0
strncpy(value1, value2, size);
字符串的比较
/ 字符串的比较
char value1[10] = "lnn";
char value2[10] = "mmm";
// strcmp他会对传入的两个字符串进行比较,比较完毕会返回一个整数,0 表示相等,小于 0 代表第一个字符串小于第二个字符串,大于 0 表示第一个字符串大于第二个字符串
int result = strcmp(value1, value2);
printf("两个字符串 value1 和 value2 相比较的结果是:%i\n",result);
字符串数组
// 字符串数组
// 一个字符串是数组,要存储多个字符串,就是用二维数组
char name1[] = "lnn";
char name2[] = "xmg";
char name3[] = "sss";
char name4[] = "yf";
// 以上存储太过麻烦,使用二维数组存储
char names[10][10] = {
"lnn",
"xmg",
"sss",
"yf"
};
字符串练习
int main(){
// 练习
// 编写一个函数char_contains(char str[],char key),如果字符串str 中包含key 则返回 1,否则返回 0
char value3[] = "abc";
int leigth = strlen(value3);
char key = 'c';
int result1 = char_contains(value3, key);
printf("是否包含,看看结果吧:%i\n",result1);
}
int char_contains(char str[],char key){
unsigned long leigth = strlen(str);
printf("看看用 strlen 在函数中打印的字符串长度:%lu\n",leigth);
int result = -1;
for (int i = 0; i < leigth; i++) {
// int result = strcmp(value3[i], key);
printf("看看字符串的值是:%c\n",str[i]);
if (str[i] == key) {
result = 1;
break;
}else
{
result = 0;
}
}
return result;
}