2017-01-14 5 views
3

Привет, ребята, у меня есть строка (в данном случае веб-сайт (www.example.com)), и я хочу проверить, что она заканчивается на .com. Как я могу это сделать? Это? Я здесь новый, извините, если это немного раздражает некоторых (в конце концов я получу лучше). Вот что я пробовал:Как проверить, содержит ли строка содержащую подстроку в конце - C

compName(char str1[], char str2[]) 
{ 
    int i = 0, c = 0; 
    for (i; str2[i] != 0; i++) 
     str2[i] = 0; 
    while (str1[i] != '.') 
     i++; 
    i++; 
    while (str1[i] != '.') 
    { 
     str2[c] = str1[i]; 
     i++; 
     c++; 
    } 
    str2[i] = 0; 
    if (str2[0] >= 97 && str2[0] <= 122) 
     str2[0] = str2[0] - 32; 
    printf("%s", str2); 
} 
+3

Почему вы не 'strstr()'? – EOF

+0

вход пользователем, поэтому я не могу знать, где заканчивается «.com» – Opohass

+0

Удовлетворяющий факт: вы можете сравнивать непосредственно с литералом 'char', а не полагаться на код ASCII. Делает код более читаемым. –

ответ

2

Вашей функция имеет проблемы:

  • опустить тип возврата, это больше не поддерживается стандартным С.
  • Первого for цикл эффективно не стирает строку указана str2. Нет никакой гарантии, что он имеет нулевой ограничитель.
  • цикл while вызывает неопределенное поведение, если str1 не содержит . или, если оно меньше, чем str2.
  • не имеют жестких значений ASCII, таких как 97 или 122. Он не переносимый, даже не читаемый. Используйте 'a' и 'z' или предпочтительно функции, определенные в <ctype.h>.

Вот простая функция строка для вашей цели:

int str_ends_with(const char *s, const char *suffix) { 
    size_t slen = strlen(s); 
    size_t suffix_len = strlen(suffix); 

    return suffix_len <= slen && !strcmp(s + slen - suffix_len, suffix); 
} 
+0

Какова цель '! Strcmp (s + slen - suffix_len, suffix);' в конце? – Opohass

+0

@Opohass: 'str_ends_with' возвращает 1 тогда и только тогда, когда строка' suffix' не больше, чем строка, и сравнение конца строки с суффиксом возвращает '0', то есть: если' suffix' является суффиксом 'str'. – chqrlie

+0

@Opohass: я не рассмотрел проблему, вы можете легко написать независимую от случая версию 'str_ends_with' в терминах независимого от случая' strcasecmp() 'или' stricmp() '. – chqrlie