在字符串大写C中创建特定单词

时间:2010-10-15 09:12:02

标签: c search

我正在努力找出解析字符串的方法,并通过将其设为大写来“突出显示”结果中的搜索词。

我已经尝试过使用strstr并移动一个指针和“toupper”字符,但无济于事。

char * highlight( char *str, char *searchstr ) {

 char *pnt=str;
 int i;

 pnt=strstr(str,searchstr);

 while(pnt){

 printf("ststr retured: %s\n", pnt);

 for(i=0;i<strlen(searchstr);i++) {
  printf("%c",toupper(pnt[i]));
 }
 printf("\n"); 
 pnt=pnt+strlen(searchstr);
 pnt=strstr(pnt,searchstr);

}

 return str;

}

非常感谢任何建议。

3 个答案:

答案 0 :(得分:2)

由于Schot提到了每一次事件:

#include <string.h>

char *highlight(char *str, char *searchstr) {

  char *pnt = str;

  while (pnt = strstr(pnt, searchstr)) {
    char *tmp = searchstr;
    while(*(tmp++)) { *pnt = toupper(*pnt); pnt++; }
  }
  return str;

}

int main() {
  char s[] = "hello world follow llollo";
  char search[] = "llo";
  puts(highlight(s, search));
  return 0;
}

输出是:

$ ./a.out 
heLLO world foLLOw LLOLLO

答案 1 :(得分:1)

您是否理解该函数将字符串作为参数然后返回相同的字符串,同时还没有修改该字符串?所有函数都是打印到stdout大写字符。

在某些时候,您需要更改字符串本身,例如;

pnt [i] = toupper(pnt [i]);

答案 2 :(得分:0)

就像Blank Xavier所说,你可能想要修改实际的字符串。 toupper不会更改您提供的字符的值,但会返回一个大写字母的新字符。您必须将其显式指定回原始字符串。

一些额外提示:

  • 永远不要对不会更改的字符串执行多次strlen调用,只执行一次并存储结果。
  • 您可以通过将searchstr声明为const char *来表达不改变strstr的承诺。
  • 下面是一个示例(我认为)循环所有#include <string.h> #include <ctype.h> char *highlight(char *s, const char *t) { char *p; size_t i, len = strlen(t); for (p = s; (p = strstr(p, t)); p += len) for (i = 0; i < len; i++) p[i] = toupper(p[i]); return s; } 匹配的简单方法:
{{1}}