C++开发学习笔记:C++利用strtok函数根据特定字符分割字符串

1.使用strtok函数分割字符串

//定义一个char*指针类型的变量;strlen获取变量的实际长度;       
char * src_columns = new char[strlen(SRC_COLUMNS) + 1];
		strcpy(src_columns, SRC_COLUMNS);//将字符串转换为char*指针类型
		EDLog(1, 1, "指针类型变量的值[ %s ] ", (const char*)src_columns);
		string str = src_columns;
        //从str的开始位置到str的结束位置查找
		strCount = count(str.begin(), str.end(), ',');
		EDLog(1, 1, "逗号在字符串中出现的次数[ %d ] ", strCount);

		EDLog(1, 1, "字符串第一次分割前src_columns[ %s] ", (const char*)src_columns);

		//strtok:用指定的分割符','分割字符串;第一次分割必须填写第一个参数,后面分割第一个参数可以设置为NULL
		//执行后会改变指针变量的值src_columns的值改变为第一次分割的值
		char * srcColumns = strtok(src_columns, ",");
		
		EDLog(1, 1, "字符串第一次分割后src_columns[ %s] ", (const char*)src_columns);
	
		while (srcColumns != NULL)//循环取出分割后
		{
			EDLog(1, 1, "上一次分割的值srcColumns=[ %s] ", (const char*)srcColumns);
			SrcColumns = srcColumns;
			srcColumns = strtok(NULL, ",");
			EDLog(1, 1, "再次分割后的值srcColumns[ %s] ", (const char*)srcColumns);

			EDLog(1, 1, "再次分割后被分割字符串的值src_columns[ %s] ", (const char*)src_columns);
			//break;
		}

2.使用strtok函数分割字符串(两个字符串嵌套循环分割)

char * src_columns = new char[strlen(SRC_COLUMNS) + 1];//定义一个char*指针类型的变量;strlen获取变量的实际长度;
char * dst_columns = new char[strlen(DST_COLUMNS) + 1];//定义一个char*指针类型的变量;strlen获取变量的实际长度;


strcpy(src_columns, SRC_COLUMNS);//将字符串转换为char*指针类型
strcpy(dst_columns, DST_COLUMNS);//将字符串转换为char*指针类型

EDLog("指针类型变量的值[ %s ] ", (const char*)src_columns);
string str = src_columns;
//char * douHao = strstr(src_columns, ",");

strCount = count(str.begin(), str.end(), ',');
printf("逗号在字符串中出现的次数[ %d ] ", strCount);

//strtok:用指定的分割符','分割字符串;第一次分割必须填写第一个参数,后面分割第一个参数可以设置为NULL
//执行后会改变指针变量的值src_columns的值改变为第一次分割的值
char * srcColumns = strtok(src_columns, ",");
//strtok:用指定的分割符','分割字符串;第一次分割必须填写第一个参数,后面分割第一个参数可以设置为NULL
//执行后会改变指针变量的值dst_columns的值改变为第一次分割的值
char * dstColumns = strtok(dst_columns, ",");

while (srcColumns != NULL)//循环取出分割后
{
	char msg[100];
	sprintf(msg,"%d", count_temp + 1);
	CString a =msg;
	SrcColumns = srcColumns;
	printf("第" + a + "次循环srcColumns=[ %s] ", (const char*)srcColumns);

	printf("第" + a + "次循环临时变量SrcColumns_pre=[ %s] ", (const char*)SrcColumns_pre);
	printf("第" + a + "次循环临时变量SrcColumns_pre1=[ %s] ", (const char*)SrcColumns_pre1);
	if (SrcColumns_pre.Find(srcColumns) > -1)
	{
		srcColumns = strtok(NULL, ",");
		printf("第" + a + "次循环比对之后重新分割的值srcColumns[ %s] ", (const char*)srcColumns);
		continue;
	}

	while (dstColumns != NULL)//循环取出分割后
	{
		printf("第" + a + "次循环dstColumns=[ %s] ", (const char*)dstColumns);
		DstColumns = dstColumns;


		if (DstColumns_pre.Find(dstColumns) > -1)
		{
			dstColumns = strtok(NULL, ",");
			continue;
		}
		printf( "第" + a + "次循环临时变量DstColumns_pre1=[ %s] ", (const char*)DstColumns_pre1);

		DstColumns_pre = DstColumns_pre + dstColumns + ",";

		printf("第" + a + "次循环临时变量DstColumns_pre=[ %s] ", (const char*)DstColumns_pre);
		dstColumns = strtok(NULL, ",");
		printf( "第" + a + "次循环再次分割后dstColumns=[ %s] ", (const char*)dstColumns);
		break;
	}
	count_temp++;

	SrcColumns_pre = SrcColumns_pre + srcColumns + ",";
	printf( "第" + a + "次循环临时变量SrcColumns_pre=[ %s] ", (const char*)srcColumns);
	if (count_temp <= strCount + 1)
	{
		//由于strtok分割时改变了src_columns的原始值,因此需要重新定义
		src_columns = new char[strlen(SRC_COLUMNS) + 1];
		strcpy(src_columns, SRC_COLUMNS);//将字符串转换为char*类型
		srcColumns = strtok(src_columns, ",");
	}
}
printf("细部资源查询sql = [%s]", (const char*)returnSql);

注:

strtok第一次分割执行之后,需要分割的字符串变量(strtok函数的第一个参数)的值被改变为第一次分割之后的结果

<> 一些背景知识: 1. 一个汉字在c\c++的存储, 使用2个字节(char)存储; 2. 汉字存储的第一个char, 其值一定大于'~'(0111 1110=126),否则将导致识别歧义; 此处, 使用"单ASCII字符"来表示非 单ASCII字符的判断, 可以根据以下规则(主要R3, R4); : 一个字符串的长度==1,那肯定是一个ASCII字符; : 一个字符串的长度==2,且第1个ASCII字符的编码小于'~'; 那肯定是2个单ASCII字符; -- (PS: "") : 一个字符串的长度==3,且间的ASCII字符的编码小于'~'; 那第3个肯定是单ASCII字符; (前2个是否构成1个汉字不能确定) : (基于R3)如果第pos个位置的ASCII字符编码小于'~', 那从下标pos,pos+1处拆分字符串 (下标pos归前串),将不会导致乱码; A 或者 B 的选择,需要知道以下信息: (1). 从 cut_base_pos 开始到 pos_B 结束的这段字符串内, 最后一个单ASCII字符的结束下标 p 在此基础上, 若使用: y -- 表示单ASCII字符(已确定的); x -- 表示可能是 单ASCII字符,也可能是 汉字的半个ASCII存储码; 那么一段长度为N的字符串,按照存储的ASCII码可以表示为一串如下的字符串(不包含[]) "x .. x][x .. x y x .. x][x .. x", 其 s,e表示当前正在分析的一段子串(0<=s<e<=N, 下标e-s = 期望的分割长度cut_size) ^ ^ ^ ^ ^ 0 s p e N 在 【s, e】 之间, 查找结束下标p 的思路: 从e开始向s查找, 找到 第一个y 后 break; 记录下标p, 则从位置p开始, 是一个正确的分割(cut); 但此分割并不是一个最好的分割. 可以在 位置p上, 再加上 2K 个长度, 使 p+2K 与 pos_B 最接近即可. 可以认为从2K个长度的内容是K个汉字(实际上并不一定..), 但并不影响这个最佳分割的正确性! :)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值