第一次在这里发帖,所以如果我搞砸了,我很抱歉。 我需要搜索一个字符串并返回包含搜索数据的任何字符串,并突出显示搜索数据。
实施例:
如果我的初始字符串为:Hi my name is
,我的搜索字词为:name
,则输出应为:Hi my NAME is
这是我编写的快速代码,但它只能工作一次。如果我再次尝试搜索它会发生故障。
我希望有人能以更好的方式提示我写这个,因为这段代码很恶心!
void search(char * srcStr, int n){
int cnt = 0, pnt,i = 0;
char tmpText[500];
char tmpName[500];
char *ptr, *ptr2, *ptrLast;
int num;
while(*(node->text+cnt) != '\0'){ //finds length of string
cnt++;
}
for(pnt = 0; pnt < cnt; pnt++){ //copies node->text into a tmp string
tmpText[pnt] = *(node->text+pnt);
}
tmpText[pnt+1] = '\0';
//prints up to first occurrence of srcStr
ptr = strcasestr(tmpText, srcStr);
for(num = 0; num < ptr-tmpText; num++){
printf("%c",tmpText[num]);
}
//prints first occurrence of srcStr in capitals
for(num = 0; num < n; num++){
printf("%c",toupper(tmpText[ptr-tmpText+num]));
}
ptr2 = strcasestr((ptr+n),srcStr);
for(num = (ptr-tmpText+n); num < (ptr2-tmpText); num++){
printf("%c",tmpText[num]);
}
while((ptr = strcasestr((ptr+n), srcStr)) != NULL){
ptr2 = strcasestr((ptr+n),srcStr);
for(num = (ptr-tmpText+n); num < (ptr2-tmpText); num++){
printf("%c",tmpText[num]);
}
for(num = 0; num < n; num++){
printf("%c",toupper(tmpText[ptr-tmpText+num]));
}
ptrLast = ptr;
}
//prints remaining string after last occurrence
for(num = (ptrLast-tmpText+n); num < cnt; num++){
printf("%c",tmpText[num]);
}
}
答案 0 :(得分:0)
只是因为我是愚蠢的懒惰,没有先决条件与多字节字符一致(这使得 helluva 更难)。有更有效的方法,但除了strupr()
和strlwr()
平台之外,很难简化。
注意:这考虑了搜索txt在混合情况下存在于源中的可能性,而不是严格小写的情况。如果问题域仅限于替换完全小写的匹配,则也可以删除源dup,从而使这个行数减少了大约6个。
// search for lower case
void substlwr(char* text, const char* str)
{
// dup strings for lower case text and search content,
// and upper case replacement text.
size_t slen = strlen(str);
char *lbase = strdup(text);
char *lstr = strdup(str);
char *ustr = strdup(str);
char *found = lbase;
char *p = NULL;
// convert lowers and uppers
for (p=lbase; p && *p; *p++ = tolower(*p));
for (p=lstr; p && *p; *p++ = tolower(*p));
for (p=ustr; p && *p; *p++ = toupper(*p));
// replace all lowers with uppers
while ((found = strstr(found, lstr)))
{
memcpy(text + (found-lbase), ustr, slen);
found += slen;
};
free(lbase);
free(lstr);
free(ustr);
}
示例调用如下所示:
int main(int argc, char *argv[])
{
char text[] = "Hi! My Name is George.";
substlwr(text, "name");
printf("%s\n", text);
return EXIT_SUCCESS;
}
,输出如下:
Hi! My NAME is George.