Создание конкретного слова в верхнем регистре строки C - PullRequest
1 голос
/ 15 октября 2010

Я очень стараюсь найти способ разобрать строку и «выделить» поисковый термин в результате, сделав его заглавным.

Я пытался использовать strstr, перемещать указатель вдоль и «перемещать» символы, но безрезультатно.

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 ]

2 голосов
/ 15 октября 2010

Поскольку Шот упоминал о каждом случае:

#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 голос
/ 15 октября 2010

Вы понимаете, что функция принимает строку в качестве аргумента, а затем возвращает эту же строку, в то время как эта строка не изменена? все, что делает функция, это печатает, чтобы выводить заглавные буквы.

В какой-то момент вам потребуется изменить саму строку, например;

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

0 голосов
/ 15 октября 2010

Как Бланк Ксавье сказал, что вы, вероятно, хотите изменить фактическую строку.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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...