12-C语言字符串

目录:

一、字符串

二、字符串输入输出函数

三、指针数组(字符串数组)

回到顶部

一、字符串

1 一组字符数组,以数组的首地址开始,以ASC码的''结束。

2 字符串与普通数组的区别:普通数组没有结束标识,而字符串是有的。

3 字符串的定义方式:

字面值:"hello"

使用字符数组定义字符串:char str[10] = {''a,'b',''};

使用字符指针:char* str = "hello";

4 字符串创建方式的不同

声明的变量数组是放在内存中的栈区。

字面值创建的字符在内存代码区。如果创建的字符串,且值是相同的,只会创建一个内存区域,值是只读的。

使用数组方式创建的字符串,放在内存中栈区,其值可以改变。

字符指针,只是指向了内存的一个区域。

 1 #include <stdio.h>
 2 
 3 int main(int argc, const char * argv[])
 4 {
 5 
 6     // 字面值
 7     printf("Hello, World!
");
 8     // 字符数组
 9     char str[10] = {'h','e','l','l','o',''};
10     str[1] = 'a';
11     char str5[10] = {'h','e','l','l','o',''};
12     // 字符指针
13     char* str2 = "hello";//字面值字符串不可以改变其值
14     char* str3 = str;
15     char* str4 = "hello";
16     // 输出
17     printf("str:%s
",str);
18     printf("str2:%s
",str2);
19     printf("str3:%s
",str3);
20     printf("str:%p
",str);
21     printf("str2:%p
",str2);
22     printf("str3:%p
",str3);
23     printf("str4:%p
",str4);
24     printf("str5:%p
",str5);
25     return 0;
26 }

练习:键盘输入个人信息,姓名:年龄:性别:薪资:

 1 #include <stdio.h>
 2 //练习:键盘输入个人信息,姓名:年龄:性别:薪资:
 3 int main()
 4 {
 5     printf("输入个人信息:
");
 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
",name);
20     printf("性别%c
",sex);
21     printf("年龄%d
",age);
22     printf("薪资%lf
",salary);
23     return 0;
24 }

xcode快捷键:command +a 、 Ctrl+i全选格式化

回到顶部

二、字符串输入输出函数

1输入

scanf()接收用户从键盘上输入的数据。

scanf(%*c)清空缓存区

练习:输入三次性别,并输出。

在输入字符串的时候不存在缓冲区问题,但存在安全性问题,(内存溢出)。

解决:fgets()函数

语法格式:fgets(参数1,参数2,参数3)

参数1保存数据的首位置

参数2保存的是长度(包括结束符)

参数3获取数据的方式

注:使用fgets方式输入数据的时候,会自动在数据的后面加上' ';计算数据的时候,原有数据内容加上'',' ';解决安全性问题,主要是参数2;

假如字符串长度是3:

abcde   ->  abcde

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("请输入第一个字符:
");
 9      scanf("%c",&ch1);
10      scanf("%*c");//清除缓冲存
11      printf("请输入第二个字符:
");
12      scanf("%c",&ch2);
13      scanf("%*c");
14      printf("请输入第三个字符:
");
15      scanf("%c",&ch3);
16      
17      printf("输出第一个字符:%c
",ch1);
18      printf("输出第二个字符:%c
",ch2);
19      printf("输出第三个字符:%c
",ch3);
20      */
21     
22     char ch1[6],ch2[6];
23     printf("请输入第一个字符串:
");
24     fgets(ch1, 6, stdin);
25     //printf("输出第一个字符串:%s %s
",ch1,ch1);
26     puts(ch1);
27     printf("test
");
28     /*
29     printf("请输入第二个字符串:
");
30     fgets(ch2, 6, stdin);
31     printf("输出第二个字符串:%s
",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 ",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
",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("输入姓名:
");
17         scanf("%s",name[i]);
18         names[i] = name[i];
19     }
20     for (int i = 0; i < 3; i++) {
21         printf("names:%s
",names[i]);
22     }
23 }
24 int main(int argc, const char * argv[])
25 {
26 
27     test2();
28     return 0;
29 }
原文地址:https://www.cnblogs.com/yangmx/p/3474255.html