假设有这样一些字符串:
char *str = "C1,C10,C11, C100, C101, C102, C12,C17,C54,C55,C56,C57,C58,C59," "C60,C61,C62,C63,C64,C65,C66,C67,C68,C69,C70,C71,C72,C73,C74," "C75,C76,C77,C78,C79,C80,C81,C82,C83,C84,C85,C86,C87,C88";
C1, C10-C12,C17,C54-C88,C100-C102
#include <stdio.h> #include <string.h> #include <vector> #include <ctype.h> using namespace std ; void GetPrefixStr(char *strIn, char *strOut); void GetFormatStr(const char *strIn, const char *strPrefix, char *strOut); void GetEveryContinueStr(const char *strIn, char *strOut); char *MyStrStr(const char *strSource, const char *strDest); void GetFristWord(const char *strIn, char *strWord); void main() { char strPrefix[100] = {0}; char buf[100] = {0}; //设一个电容C开头的字符串数组(下面是连续的一行串) //char *str = "C1,C10,C11, C100, C101, C102, C12,C17,C54,C55,C56,C57,C58,C59," // "C60,C61,C62,C63,C64,C65,C66,C67,C68,C69,C70,C71,C72,C73,C74," // "C75,C76,C77,C78,C79,C80,C81,C82,C83,C84,C85,C86,C87,C88"; //设一个LED开头的字符串数组 char *str = "LED600,LED60,LED10,LED11, LED100, LED101, LED102, LED12,LED17,LED54,LED55,LED56,LED57,LED58,LED59"; GetFristWord(str, buf); //拷贝出第一个单词 GetPrefixStr(buf, strPrefix); //得到前缀字母 printf("前缀: %s\n", strPrefix); char strOut[1000] = {0}; GetFormatStr(str, strPrefix, strOut); printf("处理完毕: %s\n", strOut); } // // 改造过的字符查找,主要是针对匹配整个,如源串"C10",在目标串"C101 C102"中不能算查找成功! // char *MyStrStr(const char *strSource, const char *strDest) { char *tmp = (char *)strSource; int len = strlen(strDest); while(1) { tmp = strstr(tmp, strDest); if (!tmp) break; if(tmp[len] == '\0' || tmp[len] == ',' || tmp[len] == ' ') return tmp; tmp += len; } return NULL; } void GetFormatStr(const char *strIn, const char *strPrefix, char *strOut) { if(strIn == NULL || strPrefix == NULL || strOut == NULL) return; #define MAX_IN_BUF (1024) #define MAX_LEN (1024) int i = 0; int j = 0; char strWord1[100] = {0}; char strWord2[100] = {0}; char strTmp[1000] = {0}; char strTmp2[1000] = {0}; char strTmp3[1000] = {0}; for(i=0; i<MAX_LEN; i++) //默认认为不会超过1000个逗号分割的串 { sprintf(strWord1, "%s%d", strPrefix, i); if(MyStrStr(strIn, strWord1)) { //添加当前要处理的一个 strcpy(strTmp, strWord1); strcat(strTmp, ","); //开始循环当前一个单词能匹配上的 int cur = i; for(j=0; j<MAX_LEN; j++) { sprintf(strWord2, "%s%d", strPrefix, j); if(MyStrStr(strIn, strWord2)) { if(j-cur == 1) { strcat(strTmp, strWord2); strcat(strTmp, ","); i = cur = j; } } } //找到了当前匹配上的一组单词,开始处理这一组 //printf("%s\n", strTmp); strTmp2[0] = '\0'; GetEveryContinueStr(strTmp, strTmp2); //处理完这一组单词,保存下来 strcat(strTmp3, strTmp2); strcat(strTmp3, ","); } } //去掉最后一个逗号 int num = strlen(strTmp3); if (strTmp3[num-1] == ',') { strTmp3[num-1] = '\0'; } strcpy(strOut, strTmp3); } void GetFristWord(const char *strIn, char *strWord) { char buf[100] = {0}; strncpy(buf, strIn, 100); //假设一个word不会超过100个字节长 char *tmp = (char *)buf; while(1) { if(*tmp == ',' || *tmp == ',' || *tmp == '\0') { break; } tmp++; } *tmp = '\0'; strcpy(strWord, buf); } // // 得到如"C100, C102"中的字符"C" // void GetPrefixStr(char *strIn, char *strOut) { char buf[100] = {0}; strcpy(buf, strIn); char *tmp = buf; while(1) { if (isdigit(*tmp)) { *tmp= '\0'; strcpy(strOut, buf); return ; } if(*tmp == '\0') break; tmp++; } strcpy(strOut, buf); } // // 处理"C10, C11, ..., C89"成 "C10-C89" // void GetEveryContinueStr(const char *strIn, char *strOut) { char tmp[100] = {0}; char seps[] = " ,"; char *token = NULL; vector<char *> s; token = strtok( (char *)strIn, seps ); while( token != NULL ) { s.push_back(token); token = strtok( NULL, seps ); } if(s.size() == 1) { strcpy(strOut, strIn); return; } else { strcpy(strOut, s[0]); strcat(strOut, "-"); strcat(strOut, s[s.size()-1]); } }