嵌入式学习之路(十六)——C语言学习(11)
今天我们来讲讲字符串
一。字符串的理解
内存中一组连续的字符类型存储位置,以'\0'为结尾的这些存储位置叫做字符串
二。字符串的认识
“abc”,”1+8+6”,”hello”......这些叫做字符串字面值,存储在只读常量区
编译器会把这些带双引号的字符串自动地加上'\0'结束符,
我们可以定义一个字符类型的指针,来指向字符串
char *p_str = “abc”;
这里我们可以知道,字面值常量会把他的首地址赋给字符指针,相当于”abc”就是一个地址
三。字符串的使用
char *p_str = “abc”;
char arr[4] = “abc”;
那么大家来看一下下面的赋值是否正确:
1.p_str= “def”;//正确
2.arr= “def”;//错误,编译器会报类型不兼容
3.p_str[0]= ’a‘;//错误,编译不报错,但是执行会报段错误
4.arr[0]= 'a';//正确
四。字符串的操作函数:需要包含<string.h>
1.strlen:size_t strlen(const char *s);
用来获得字符串的有效字符长度,不包括'\o'
2.strcpy:char *strcpy(char *dest, const char *src);
用于字符串的复制,返回值就是复制完成的首地址
3.strcmp:char *strcpy(char *dest, const char *src);
用来比较相隔字符串是否相同,比较的依据是字符数据的ascii码
前一个字符串大时,返回1,后一个字符串大时,返回-1,相等时,返回0
4.strcat:char *strcat(char *dest, const char *src);
把一个字符串追加在另一个字符串的后面,返回值表示合并后的结果
五。字符串的输入输出
1.输入:
char str[10];
scanf(“%s”,str);//只读取输入的字符串,后面的换行符不会读取,还留在缓存区
fgets(str,10,stdin);//连换行都会读走,
那我们来看一个程序
1 #include <stdio.h>
2 #include <string.h>
3 int main()
4 {
5 char ch[10] = {};
6 printf("请输入一个字符串:");
7 scanf("%s",ch);
8 printf("scanf读取的个数 = %d\n",strlen(ch));
9 printf("ch = %s\n",ch);
10 scanf("%*c");/*读走换行符,不然fgets会直接读取了回车*/
11 printf("请输入一个字符串:");
12 fgets(ch,10,stdin);/*fgets连换行符都会读走*/
13 printf("fgets读取的个数 = %d\n",strlen(ch));
14 printf("ch = %s\n",ch);
15 printf("请输入一个字符串:");/*所以这之前不用再读走换行符*/
16 fgets(ch,10,stdin);
17 printf("fgets读取的个数 = %d\n",strlen(ch));
18 printf("ch = %s\n",ch);
19 }
我们来看一下效果:
~/csdn/day14$./a.out
请输入一个字符串:1
scanf读取的个数=1
ch= 1
请输入一个字符串:12
fgets读取的个数=3
ch= 12
请输入一个字符串:123
fgets读取的个数=4
ch= 123
很明显我们就看到了效果,还有一点大家知道一下:
scanf是遇到空格就会停止读取的
所以你如果想输入中间有空格的字符串,这个时候你就可以用fgets了
六。附加的函数
sprintf():int sprintf(char *str, const char *format, ...);
我们先来看一个代码
1 #include <stdio.h>
2
3 int main()
4 {
5 char *ch = "123";
6 char *ch1 = "abc";
7 char ch2[10];
8 sprintf(ch2,"%s%s",ch,ch1);//和并字符串常用此函数
9 printf("%s\n",ch2);
10 int a = 100;
11 int b = 300;
12 char ch3[10];
13 sprintf(ch3,"%d%d",a,b);//也可以用来转换成字符串
14 printf("%s\n",ch3);
15 return 0;
16 }
:~/csdn/day14$./a.out
123abc
100300
从输出我们可以看到,sprintf的强大之处,是不是很牛逼
当然还有和他配对的sscanf函数,也是很牛逼的
int sscanf(const char *str, const char *format, ...);
功能和sprintf当然相反啦
同样我们也来看一个程序
1 #include <stdio.h>
2
3 int main()
4 {
5 char *ch = "zhangfei 123";//经过本人实验,好像空格是可以的,
6 char a[10];
7 int b;
8 sscanf(ch,"%s %d",a,&b);//这边也要有空格
9 printf("%s\n",a);
10 printf("%d\n",b);
11 return 0;
12 }
:~/csdn/day14$./a.out
zhangfei
123
好像这个函数稍微写的不是很智能,只有空格能行,可能我还不知道它的正确用法吧
求大神指导
七。strcpy和strcat函数的编写
1 #include <stdio.h>
2
3 char *mystrcpy(char *dest,const char *src)
4 {
5 char *address = dest;
6 while(*address++ = *src++)
7 {
8 NULL;
9 }
10 return address;
11 }
12 char *mystrcat(char *dest,const char *src)
13 {
14 char *address = dest;
15 while(*(++address));
16 while(*address++ = *src++)
17 {
18 NULL;
19 }
20 return address;
21 }
22 int main()
23 {
24 char *str = "abc" ;
25 char str1[10] = {1,2,3};
26 mystrcpy(str1,str);
27 printf("%s\n",str1);
28 mystrcat(str1,str);
29 printf("%s\n",str1);
30 return 0;
31 }
那么今天的字符串就说这么多吧!C语言的魅力是不是慢慢展现出来了呢?