博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于字符串的一些操作
阅读量:6367 次
发布时间:2019-06-23

本文共 3678 字,大约阅读时间需要 12 分钟。

  之前一直没有关注字符串的操作,以为嵌入式肯定用不到,这次播放器实验中用到了,需要在这里总结一下。

  源文件放在

  

  1、字符串的赋值

  C语言中,有两种方式可以存放字符串。字符数组和字符指针,见下面的程序。如果用数组的方式来存放,str0和str1是一种,把每个字符都分开写。str0有明确的数组长度,打印的时候,没有赋值的部分自动为0.而str1没有明确的长度,没有赋值的长度是不定的,而且打印出来,除了有效部分,还有打印中乱七八糟的东西。如果在str1的赋值末尾加上'\0',就能明确限定长度了。str2是字符数组的另一种方式,肯定首选这个了。

  要注意的是,字符指针指向的是字符串常量,是不能修改的。而字符数组是可以修改的。

  2、字符串的打印

  可以直接用printf("%s")来打印,也可以用循环的方式,通过判断末尾来打印,见程序中str3的打印。str0/1/2能用循环打印吗?当然也是可以了,但是不能通过str0/1/2++的方式,因为str0/1/2是数组,是字符常量。而指针是可以自由移动的,想打印str3所指向的字符串,第五个字符后面的部分,直接用str3=str3+5,然后用printf函数打印出来即可。

  3、字符串的长度

  见程序中printf函数的打印值,长度都在注释中。

#include 
#include
int main(void){ //数组和指针两种定义 char str0[20]={
'I','L','O','V','E','Y','O','U'}; char str1[]={
'I','L','O','V','E','Y','O','U'}; //初始化的时候可以这样,不能用于赋值,注意这个终止的 char str2[]="ILOVEYOU"; //{"ILOVEYOU"} 一样 char *str3="ILOVEYOU"; printf("str0 is %s\n",str0); printf("str1 is %s\n",str1); //ILOVEYOU$@&,如果str1有确定的长度,后面就不会乱了,长度比ILOVEYOU长点也没关系 printf("str2 is %s\n",str2); //ILOVEYOU printf("str3 is %s\n",str3); //ILOVEYOU printf("str2[5] is %c\n",str2[5]); //ILOVEYOU while(*str3!='\0') { printf("%c",*str3); str3++; } printf("\nsizeof str0 is %d\n",sizeof(str0)); //20 printf("sizeof str1 is %d\n",sizeof(str1)); //9 printf("sizeof str2 is %d\n",sizeof(str2)); //9 printf("sizeof str3 is %d\n",sizeof(str3)); //4 printf("strlen of str2 is %d\n",strlen(str2)); //8}

下面是几个基本函数操作,strcpy;strcat;strcmp,具体见下面的函数

#include 
#include
#include
int main(void){ char str3[20]="ILOVEYOU"; char *str4="ILOVEYOU"; int cmp1,cmp2; //strcpy char *dst; dst=(char *)malloc(50); str4=str4+5; //指针偏移了 printf("str4 is %s\n",str4); //YOU strcpy(dst,str4); //把后面部分拷贝给dst printf("dst is %s\n",dst); //YOU //strcat char *mes="hahaha"; strcat(dst,mes); //拼接 printf("dst is %s\n",dst); //YOUhahaha //strcmp ,观察比较的两种方式 cmp1=strcmp(str3,str4); //-1 cmp2=strcmp(str3,"ILOVEYOU"); //0 printf("cmp1 is %d,cmp2 is %d\n",cmp1,cmp2); free(dst);}

在嵌入式中,字符串的操作也就差不多了。下面是一个具体的例子,来巩固一下。Change的作用是把文件名转换成大写,tell_type用来识别是不是wav文件。

观察change这个函数,加入char *str2="iii.jjj.wav",然后传入change函数,运行到*str2=*str2-32是会报错的,因为str2指向的是字符串常量,是不能被修改的。

而字符数组是可以修改的。然后既然是字符数组,为什么可以str++呢?前面第二点中,字符数组打印,不是不能str0/1/2++的吗?我的理解是,观察change函数的参数,当数组名传入的时候,可以被转换成了字符指针,相当于有一个字符指针,指向了这个字符数组。

#include 
#include
void change(char *str);int main(void){ char str2[]="iii.jjj.wav"; char str3[]="iii.jjj.wav.jpg"; change(str2); change(str3); tell_type(str2); tell_type(str3);}//如果是指针指向的数组,是不能被修改的。//数组的才能被修改void change(char *str){ while(*str!='\0') { if((*str>=97)&&(*str<=120)) *str=*str-32; //数组可以赋值,指针不行 str++; }}int tell_type(char *p){ int i=0; char *attr; while(i<100) { if(*p=='\0') //到末尾了 break; i++; p++; } if(i==100) return 1; i=0; while(i<5) { if(*p=='.') { p++; attr=p; break; } i++; p--; } if(i==5) return 2; if(strcmp(attr,"WAV")==0) { printf("%s is a WAV file\n",p); return 0; } else { printf("%s is not a wav file\n",p); return 4; }}

 

就像下面这个函数,定义了一个指针,指向这个字符数组。

void change(char *str);int main(void){    char str2[]="iii.JJJJ.wav";    char *s=str2;    printf("%s\n",str2);    while(*s!='\0')    {        if((*s>=97)&&(*s<=120))            *s=*s-32; //数组可以赋值,指针不行        s++;    }    printf("%s\n",str2);}

 

转载于:https://www.cnblogs.com/nasduc/p/5252239.html

你可能感兴趣的文章
[20161028]rman与filesperset=1.txt
查看>>
哪些领域适合开发微信小程序
查看>>
谁说数据库防火墙风险大?可能你还不知道应用关联防护
查看>>
ASP.NET Core应用针对静态文件请求的处理[2]: 条件请求与区间请求
查看>>
怎样做一个企业?尤其是在这个互联网时代
查看>>
防患于未然,网络安全由全而智
查看>>
DVNA:Node.js打造的开源攻防平台
查看>>
现有的大数据公司,都是如何赚钱的呢?
查看>>
17个案例带你3分钟搞定Linux正则表达式
查看>>
Java 8 比较器:如何对 List 排序
查看>>
CVPR 2017最佳论文作者解读:DenseNet 的“what”、“why”和“how”|CVPR 2017
查看>>
苹果是否步思科后尘折戟中国
查看>>
漏洞预警!微软曝光震网三代漏洞,隔离网面临重大危机
查看>>
协鑫集成第二批1000台E-KwBe光伏储能设备即将启运澳洲
查看>>
爱立信物联网广州路演
查看>>
云计算企业业绩分化明显 9家上市公司中期预喜
查看>>
《VMware Virtual SAN权威指南(原书第2版)》一3.5 可能发生的网络配置问题
查看>>
SK电讯发布Q2财报 净利润同比下降26.9%
查看>>
零售品牌如何驾驭大数据主导商业决策?
查看>>
经济模式UPS在数据中心的应用(上)
查看>>