2017-02-20 4 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ライブラリを使用していますか? 'Linux 'の' glibc'? – ventiseis

答えて

2

strcasestr機能は、標準のWindowsビルド環境の一部として使用できません。これはC標準ライブラリの一部ではなく、特定のプラットフォームおよびビルド環境でのみ提供されます。

ただし、独自のバージョンをコーディングできます。単純な文字列照合アルゴリズムに基づく簡単な例を示します。あなたはおそらくRabin-Karp、Boyer-Moore、またはKnuth-Morris-Prattアルゴリズムを使ってうまくいくでしょう:

+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

関連する問題