嵌入式学习之路(十六)——C语言学习(11)

嵌入式学习之路(十六)——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.strlensize_t strlen(const char *s);

用来获得字符串的有效字符长度,不包括'\o'

2.strcpychar *strcpy(char *dest, const char *src);

用于字符串的复制,返回值就是复制完成的首地址

3.strcmpchar *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

好像这个函数稍微写的不是很智能,只有空格能行,可能我还不知道它的正确用法吧

求大神指导

七。strcpystrcat函数的编写

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语言的魅力是不是慢慢展现出来了呢?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值