c语言的字符串攻略
1937
2021.07.24
2023.03.11
发布于 未知归属地

image.png

  1. 申请的内存用于保存字符串,在申请后首先一定要赋初始值为0;

  2. 如果字符串最大长度为10, 那么定义或者申请内存至少为11个字节;
    例如,字符串长度为10, 那么需要如下定义char ans[11];已经出过很多次错

  3. strtok_s, strcmp, strlen, strcat,strcpy,strncpy
    2.1 strcpy默认会拷贝源字符串中的0;strcat是追加,也会拷贝源字符串中的0;
    2.2 strlen是不包括结束符0的,即有效的index为strlen(s) - 1;
    2.3 申请内存来保存字符串的时候,申请的大小一定要是长度加1,最后一个字符保存结束符;
    2.4 strstr(const char *hayStatck, const char *needle),
    在第一个入参地址的字符串中搜索子串,搜索成功,返回子串的首地址;
    2.5 字符串追加可以用常量string,strcat(stringAddr, "->");

  4. strtok_s参数的分隔符是const字符串常量,返回的是被分解的第一个字符串, 适用于分隔符重复出现的问题;
    3.1 如果只出现一次,不要使用;
    3.2 不能识别多个分隔符同时出现的情况;
    3.3 分隔符出现在字符串最后也不能识别;
    3.4 strtok会修改原始的字符串内容,一般建议再开辟一块内存,先复制原始字符串内容,在进行分解;

	char *token;
	const char *delim = " ";
	token = strtok(s, delim);
	while (token != NULL) {
		token = strtok(NULL, delim);
	}
	char *nextToken;
    char *temp;

    temp = strtok_s(destIp, ".", &nextToken);
    while (temp != NULL) {
        temp = strtok_s(NULL, ".", &nextToken);
    }
  1. 如果题目中出现的是字符串是数字,而且需要比较数字的大小,比如求最大值和最小值;这时优先考虑使用strcmp函数来比较字典序;

  2. 功能强大的sscanf函数和sprintf函数,sscanf和sprintf是一对组合,用于解决字符串的格式化输入和输出。
    6.1 sscanf很容易将字符串的各个元素解析出来,代替了strtok分割的复杂操作,也可以代替atoi函数;
    如果提取字符串中的int型,对分隔符没有要求;
    如果要提取字符串中的子字符串,必须以空白、换行和制表符来分割;
    技巧:将原始字符串中的分割字符串用空格替换,这样就方便使用sscanf函数来将里面的各个元素提取出来
    6.2 sprintf很容易就将各个元素按照一定的格式输出到指定字符串中,代替了strcat,intToStr的复杂操作;
    很容易就能将各种类型转换成string;

    //将整型转换为string,sprintf的最简单的用法
    sprintf(stringAddr, "%d", intValue);
    
    //将string转换成整型;sscanf的最简单的用法
    int value;
    sscanf(stringAddr, "%d", &value); -->

下面是提取int型整数,对分割符没有要求;

 char ipStr[] = "192.168.0.1";
 int ip[4];
 sscanf(ipStr, "%d.%d.%d.%d", ip, ip + 1, ip + 2, ip + 3);

下面提取了str和int,并且按照指定格式输出了指定字符串;

   int day, year;
   char weekday[20], month[20], dtm[100];

   strcpy( dtm, "Saturday March 25 1989" );
   sscanf( dtm, "%s %s %d  %d", weekday, month, &day, &year );

   char output[1000];
   sprintf(output, "%s %d, %d = %s\n", month, day, year, weekday);

和字符串处理经常配套使用的数据结构

a) 字典树
https://leetcode.cn/circle/article/wNUP3I/

b) 哈希表
https://leetcode.cn/circle/article/u4Jvw7/

评论 (0)