【嵌入式——C语言】字符串
【嵌入式——C语言】字符串
定义
字符串就是以’\0’结尾的若干个字符的集合。字符串的地址就是第一个字符的地址,如"helloworld"的地址就是’h’的地址。
字符串存储形式
数组
在内存中(栈、静态全局区)开辟一段空间存放字符串。
- 普通全局数组内存分配在静态全局区;
- 普通局部数组内存分配在栈区;
- 静态数组(全局,局部)内存分配在静态全局区。
char str[100] = "I love C";
字符串内容是可以修改的,使用的时候不能使用=赋值,可以使用scanf(“%s”,buf);,strcpy(buf,“hello world”);。
堆
使用malloc函数在堆区申请空间,将字符串拷贝到堆区。
动态申请10个字节的存储空间,将字符串"I love C"拷贝给str,如下代码:
char* str=(char*)malloc(10);
strcpy(str,"I love C");
字符串内容是可以修改的
文字常量区
在文字常量区开辟一段空间存放字符串,将字符串首地址赋给指针变量。
char* str="I love C";
字符串内容是不可以修改的。
字符串处理相关函数
都要包含 #include <string.h>
字符串长度
strlen(const char* s);//返回字符串中的个数,不包含'\0'
int asdLen = strlen("asd");
sizeof是关键字,测量数据占用内存空间大小
strlen是库函数,测量字符串中的字符个数
char str1[20] = "hello";
const char* str2 = "hello";
printf("sizeof(str1)=%d\n", sizeof(str1));//20
printf("sizeof(str2)=%d\n", sizeof(str2));//4
printf("strlen(str1)=%d\n", strlen(str1));//5
printf("strlen(str2)=%d\n", strlen(str2));//5
字符串拷贝
strcpy
拷贝source指向的字符串到_Destination指针指向的内存,'\0’也会拷贝,返回的是目的内存的地址,必须保证_Destination指向的内存足够大,否则会造成内存污染。
char * strcpy(char _Destination,char const* _Source)
char str3[100] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
strcpy(str3,"hello");
printf("str3=%s", str3);//hello 因为有 \0把str3截断了,所以打印的只是hello,后面的a还是存在的
strnpy
将_Source指定的字符串前count个字节拷贝到destination指向的内存中,返回的是目的内存的地址,不拷贝’\0’。
char* strnpy(char _Destination, char const* _Source,size_t _Count)
char buf[100] = "aaaaaaaaaaaaaaaaaaaaaa";
strncpy(buf,"hellooo",4);
printf("buf=%s",buf); //hellaaaaaaaaaaaaaaaaaa
如果_Count大于_Source指向的字符串的字符个数,则在_Destination后面填充_Count-strlen(source)个’\0’。
字符串追加
strcat
追加src字符串到dest指向的字符串的后面追加的时候会追加’\0’。
char* strcat(char* dest,const char *src )
char buf[100] = "aaaaaaaaaaaaaaaaaaaaaa";
strcat(buf,"world");//aaaaaaaaaaaaaaaaaaaaaaworld
strncat
追加src字符串的前n个字符到dest指向的字符串后面,追加的时候会追加’\0’。
char* strncat(char* dest,const char *src,size_t n )
字符串比较
strcmp
比较s1和s2指向的字符串的大小,
- s1>s2 返回1;
- s1<s2 返回-1;
- s1=s2 返回0。
比较方法:逐个字符去比较ascII码,一旦比较出则返回,如果所有字符都一样就返回0。
int strcmp(const char* s1,const char* s2)
const char* s1 = "asda";
const char* s2 = "qwe";
int ss = strcmp(s1,s2);
printf("ss=%d",ss);
strncmp
比较s1和s2指向的字符串中前n个字符的大小。
int strncmp(const char* s1,const char* s2,size_t n)
字符串查找
strchr
在字符串s中找到ascII码为c的字符,找到的是第一个字符,找到了返回的是字符的地址,找不到返回的是NULL。
char* strchr(const char* s,int c )
const char* s1 = "asda";
const char* pp = strchr(s1, 'a');
printf("pp=%d\n", pp-s1);//0
strnchr
找到最后一次出现的ascII为c的字符,找到了返回末次匹配的字符地址,找不到返回的是NULL。
char* strnchr(const char* s,int c )
字符串匹配
在haystack指向的字符串中查找needle指向的字符串,首次匹配,找到了返回字符串首地址,找不到返回NULL。
char* strstr(const char* haystack , const char* needle)
空间设定函数
将ptr指向的内存空间的num个字节全部赋值为value。
void* memset(void *ptr,int value , size_t num)
char m[100] = "helloworld";
memset(m,'b',5);
printf("m=%s\n", m);//bbbbbworld
字符串转数值
atoi
将nptr字符串转成整数,如果无法转换则返回0。
int num = atoi("123");
printf("num=%d\n",num);
atol
long atol(const char* nptr)
atof
double atof(const char* nptr)
字符串切割函数
按照delim指向的字符串中的字符,切割str指向的字符串,其实就是在str字符串中发现了delim中的字符就将其变为’\0’,调用一次strtok只切割一次,再去切割的话,第一个参数传NULL,接着上次切割的地方继续切,如果str中出现了连续的几个delim中的字符则只将第一个字符变成’\0’。
char* strtok(char* str,const char* delim)
char str4[100] = "xiaoming:21,,,.男.女,北京:haidian";
char* str4p[7];
int i = 0;
str4p[i] = strtok(str4,":,.");//xiaoming
printf("str4p[%d]=%s\n", i, str4p[i]);
while (str4p[i] != NULL) {
i++;
str4p[i] = strtok(NULL, ":,.");
}
for (int j = 0; j < i; j++) {
printf("str4p[%d]=%s\n", j, str4p[j]);
}
// str4p[0] = xiaoming
// str4p[1] = 21
// str4p[2] = 男
// str4p[3] = 女
// str4p[4] = 北京
// str4p[5] = haidian
格式化字符串操作函数
sprintf
输出到buf指定的内存区域。
int sprintf(char* buf,const char* format,...)
char buf1[20];
sprintf(buf1,"%d:%d:%d",2023,12,10);
printf("buf=%s\n", buf1); //buf=2023:12:10
sscanf
从buf指定的内存区域读取信息。
int sscanf(const char* buf,const char* format,...)
int a, b, c;
sscanf("2023:12:10", "%d:%d:%d", &a, &b, &c);
printf("%d %d %d\n",a,b,c); //2023 12 10
sscanf
跳过数据
- %*s 跳过这一个字符串;
- %*d 跳过这一个整数。
sscanf("1234 5678","%*d %s",buf)
char bbuf[20];
sscanf("1234 5678","%*d %s", bbuf);
printf("bbuf=%s\n", bbuf); //bbuf=5678
int bnum;
sscanf("1234 5678", "%*s %d", &bnum);
printf("bnum=%d\n", bnum);//bnum=5678
指定宽度
%[width]s %4s
char buf6[20];
//从"12345678"字符串中取4个字符 放到buf6中
sscanf("12345678","%4s",buf6);
printf("buf6=%s\n", buf6);//buf6=1234
int num6;
sscanf("12345678", "%4d", &num6);
printf("buf6=%d\n", num6);//1234
支持集合操作:只支持获取字符串
%[a-z]
表示匹配a-z中的任意字符,直到碰到不在这范围内的便停止获取,a、z是任意字符,是根据ASCII匹配的。
char buf7[20];
sscanf("ans4dkfjdDJWUAKas12","%[a-z]",buf7);
printf("buf7=%s\n", buf7);//buf7=ans
%[aBc]
匹配a,B,c中的一员,只要是在这其中的都要,aBc可以是任意字符,也可以是多个。
char buf8[20];
sscanf("ans4dkfjdDJWUAKas12", "%[asn]", buf8);
printf("buf8=%s\n", buf8);//ans
%[ ^aFc]
匹配非a、F、c的任意字符。
char buf9[20];
sscanf("ans4dkfjdDJWUAKas12", "%[^DJW]", buf9);
printf("buf9=%s\n", buf9);//ans4dkfjd
%[ ^a-z]
读取a-z以外的字符。
char buf10[20];
sscanf("ADQJI3 Gajdh", "%[^a-f]", buf10);
printf("buf10=%s\n", buf10);//buf10=ADQJI3 G
格式化输出字符
- %d 十进制有符号整数
- %u 十进制无符号整数
- %x 以十六进制表示的整数
- %o 八进制表示的整数
- %f float型浮点数
- %1f double型浮点数
- %e 指数形式浮点数
- %s 字符串
- %c 单个字符
- %p 指针的值
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!