【嵌入式——C语言】字符串

发布时间:2024年01月04日

定义

字符串就是以’\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 指针的值
文章来源:https://blog.csdn.net/weixin_39723539/article/details/135370539
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。