12-C语言字符串
目录:
一、字符串
1 一组字符数组,以数组的首地址开始,以ASC码的'\0'结束。
2 字符串与普通数组的区别:普通数组没有结束标识,而字符串是有的。
3 字符串的定义方式:
字面值:"hello"
使用字符数组定义字符串:char str[10] = {''a,'b','\0'};
使用字符指针:char* str = "hello";
4 字符串创建方式的不同
声明的变量数组是放在内存中的栈区。
字面值创建的字符在内存代码区。如果创建的字符串,且值是相同的,只会创建一个内存区域,值是只读的。
使用数组方式创建的字符串,放在内存中栈区,其值可以改变。
字符指针,只是指向了内存的一个区域。
1 #include <stdio.h> 2 3 int main(int argc, const char * argv[]) 4 { 5 6 // 字面值 7 printf("Hello, World!\n"); 8 // 字符数组 9 char str[10] = {'h','e','l','l','o','\0'}; 10 str[1] = 'a'; 11 char str5[10] = {'h','e','l','l','o','\0'}; 12 // 字符指针 13 char* str2 = "hello";//字面值字符串不可以改变其值 14 char* str3 = str; 15 char* str4 = "hello"; 16 // 输出 17 printf("str:%s\n",str); 18 printf("str2:%s\n",str2); 19 printf("str3:%s\n",str3); 20 printf("str:%p\n",str); 21 printf("str2:%p\n",str2); 22 printf("str3:%p\n",str3); 23 printf("str4:%p\n",str4); 24 printf("str5:%p\n",str5); 25 return 0; 26 }
练习:键盘输入个人信息,姓名:年龄:性别:薪资:
1 #include <stdio.h> 2 //练习:键盘输入个人信息,姓名:年龄:性别:薪资: 3 int main() 4 { 5 printf("输入个人信息:\n"); 6 char name[20]; 7 char sex; 8 int age; 9 double salary; 10 printf("姓名:"); 11 scanf("%s",name); 12 printf("性别:"); 13 scanf("%*c"); 14 scanf("%c",&sex); 15 printf("年龄:"); 16 scanf("%d",&age); 17 printf("薪资:"); 18 scanf("%lf",&salary); 19 printf("姓名%s\n",name); 20 printf("性别%c\n",sex); 21 printf("年龄%d\n",age); 22 printf("薪资%lf\n",salary); 23 return 0; 24 }
xcode快捷键:command +a 、 Ctrl+i全选格式化
二、字符串输入输出函数
1输入
scanf()接收用户从键盘上输入的数据。
scanf(%*c)清空缓存区
练习:输入三次性别,并输出。
在输入字符串的时候不存在缓冲区问题,但存在安全性问题,(内存溢出)。
解决:fgets()函数
语法格式:fgets(参数1,参数2,参数3)
参数1保存数据的首位置
参数2保存的是长度(包括结束符)
参数3获取数据的方式
注:使用fgets方式输入数据的时候,会自动在数据的后面加上'\n';计算数据的时候,原有数据内容加上'\0','\n';解决安全性问题,主要是参数2;
假如字符串长度是3:
abcde\n\0 -> abc\0de\n
2 输出
printf()可以输出字符串,并且可以根据占位符的个数来决定输出字符串的个数。
puts()可以输出一个字符串,而且是自动换行。
printf()与puts()区别:
相同点:都可以输出字符串
不同点:printf()需要手动换行,可以多次输出字符串,puts()自动换行,只能输出一个字符串。
3 const关键字,可以将变量变为只读,只可以在初始化的时候才可以改变变量的值,此变量就为常量,
const int* p = &i;//指针指向的值变为只读
int* const p = &i;//指针的值变为只读
1 /*输入函数 缓冲区问题*/ 2 #include <stdio.h> 3 4 int main(int argc, const char * argv[]) 5 { 6 /* 7 char ch1,ch2,ch3; 8 printf("请输入第一个字符:\n"); 9 scanf("%c",&ch1); 10 scanf("%*c");//清除缓冲存 11 printf("请输入第二个字符:\n"); 12 scanf("%c",&ch2); 13 scanf("%*c"); 14 printf("请输入第三个字符:\n"); 15 scanf("%c",&ch3); 16 17 printf("输出第一个字符:%c\n",ch1); 18 printf("输出第二个字符:%c\n",ch2); 19 printf("输出第三个字符:%c\n",ch3); 20 */ 21 22 char ch1[6],ch2[6]; 23 printf("请输入第一个字符串:\n"); 24 fgets(ch1, 6, stdin); 25 //printf("输出第一个字符串:%s %s\n",ch1,ch1); 26 puts(ch1); 27 printf("test\n"); 28 /* 29 printf("请输入第二个字符串:\n"); 30 fgets(ch2, 6, stdin); 31 printf("输出第二个字符串:%s\n",ch2); 32 */ 33 return 0; 34 }
三、指针数组(字符串数组)
1 数组中的元素是指针,而指针又是字符串,所有也叫字符串数组。
2 保存多个字符串内容
3 定义指针数组:char* array[3]={"gy","zf","lb"};
4 遍历
for(int i = 0;i < 3;i++){
printf("array[%d]:%s\n",i,array[i]);
}
1 //指针数组 字符串数组 2 #include <stdio.h> 3 void test(){ 4 // 声明指针数组 5 char* names[3] = {"guanyu","zhangfei","liubei"}; 6 //遍历 7 for (int i = 0; i < 3; i++) { 8 printf("names:%s\n",names[i]); 9 } 10 } 11 //输入3个人姓名,输出 12 void test2(){ 13 char* names[3]; 14 char name[3][10]; 15 for (int i = 0; i < 3; i++) { 16 printf("输入姓名:\n"); 17 scanf("%s",name[i]); 18 names[i] = name[i]; 19 } 20 for (int i = 0; i < 3; i++) { 21 printf("names:%s\n",names[i]); 22 } 23 } 24 int main(int argc, const char * argv[]) 25 { 26 27 test2(); 28 return 0; 29 }