2017-02-20 5 views
3

Итак, я прочитал другие вопросы, и им было сказано поставить #define _GNU_SOURCE, прежде чем включать, и это сработает, но это не сработает для меня. Я также попытался добавить #define _GNU_SOURCE char *strcasestr(const char *haystack, const char *needle);, но все равно не работает. Я ничего не мог найти об этом, может быть, кто-нибудь может помочь? Заранее спасибо.strcasestr все еще не работает

Ошибка: неявная декларация функции «» strcasestr

/** 
* 
* Description: This is code for Lab 3 Task 2. 
*    Reads data from file and gives opportunity to search by cities 
*/ 
#define _GNU_SOURCE 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

    printf("Please input the city you want to find employees in:"); 
    scanf("%s", input); 
    maxline = i; 
    for (i = 0; i <= maxline; i++) { 
     if (strcasestr(employee[i].city, input) != 0) { // PROBLEM 
      printf("%d %s %s %s\n", &employee[i].ID, employee[i].fn, 
            employee[i].ln, employee[i].city); 
      amount++; 
     } 
    } 
    printf("%d matches out of %d members", amount, maxline); 
    return 0; 
} 
+1

Вы в Linux? – Barmar

+0

@Barmar Нет, на окнах – Quto

+0

В какой библиотеке c вы используете? 'glibc' на' Linux'? – ventiseis

ответ

2

strcasestr функция не доступна в качестве части стандартного Windows, среды сборки. Он не является частью стандартной библиотеки C и поставляется только с определенными платформами и средой сборки.

Вы можете, однако, скопировать свою версию. Вот простой, основанный на алгоритме наивного соответствия строк. Вы можете сделать лучше, используя алгоритмы Рабина-Карпа, Бойера-Мура или Кнута-Морриса-Пратта:

char* myStrcasestr(const char* haystack, const char* needle) { 
    /* Edge case: The empty string is a substring of everything. */ 
    if (!needle[0]) return (char*) haystack; 

    /* Loop over all possible start positions. */ 
    for (size_t i = 0; haystack[i]; i++) { 
     bool matches = true; 
     /* See if the string matches here. */ 
     for (size_t j = 0; needle[j]; j++) { 
      /* If we're out of room in the haystack, give up. */ 
      if (!haystack[i + j]) return NULL; 

      /* If there's a character mismatch, the needle doesn't fit here. */ 
      if (tolower((unsigned char)needle[j]) != 
       tolower((unsigned char)haystack[i + j])) { 
       matches = false; 
       break; 
      } 
     } 
     if (matches) return (char *)(haystack + i); 
    } 
    return NULL; 
} 
+2

Чтобы избежать неопределенного поведения на отрицательных значениях 'char', используйте' tolower ((unsigned char) needle [j])! = Tolower ((unsigned char) haystack [i + j]) ' – chqrlie

+0

@chqrlie Спасибо за отзыв! Является ли конвенция в C использовать 'const char *' для всех аргументов и ожидать, что клиент будет использовать возвращаемое значение, если они хотят изменить результат? – templatetypedef

+0

Нет, для согласованности с 'strstr()' и совместимости с используемым случаем OP аргументы должны быть отменены, а прототип должен быть 'char * myStrcasestr (char * haystack, char * needle);'. Оператор 'return' потребует приведения:' return (char *) haystack + i; ' – chqrlie

Смежные вопросы