Код strcmpi не скомпилируется, а strcmp будет?

У меня вопрос, почему мой код не компилируется, когда я использую strcmpi. Я протестировал этот же код с помощью strcmp, и это сработало. Не уверен, почему это не работает.

вот ошибка компиляции, которую я получаю:

gcc -std=c99 strcmpi_test.c -o strcmpi_test
strcmpi_test.c: In function 'main':
strcmpi_test.c:15: warning: implicit declaration of function 'strcmpi'
strcmpi_test.c:30:2: warning: no newline at end of file
/tmp/cceKXLcn.o: In function `main':
strcmpi_test.c:(.text+0x50): undefined reference to `strcmpi'
collect2: ld returned 1 exit status



#include <stdio.h>
#include <string.h>


int main()
{

    char name[10]; 

    char name2[10] = "bob";

    printf("what is your name : ");
    fgets(name,10,stdin);

    if(strcmpi(name,name2) == 1)
    {

        printf("name == %s name2 == %s your names are the same\n",name,name2);

    } else {

        printf("name == %s name2 == %s your names are NOT the same\n",name,name2);


    }


    return 0;

}

person Max Powers    schedule 27.08.2014    source источник
comment
strcmpi не является стандартной функцией. В Linux есть strcasecmp, который выполняет сравнение без учета регистра.   -  person M Oehm    schedule 27.08.2014
comment
@MOehm Правильно, но вы также должны упомянуть, что эта функция может быть объявлена ​​только в <strings.h> (обратите внимание на дополнительную букву S). В Linux он есть в <string.h>, но в большинстве *BSD его нет.   -  person zwol    schedule 27.08.2014
comment
@Зак: Хороший вопрос; Я этого не знал. (Но я доверяю OP поиску функции и ее объявлению, как только имя станет известно.)   -  person M Oehm    schedule 27.08.2014
comment
Привет Спасибо всем за вашу помощь. Поэтому я изменил strcmpi на strcasecmp. Кажется, это компилируется, но после компиляции я получаю предупреждение. strcmpi_test.c: В функции 'main': strcmpi_test.c:15: предупреждение: неявное объявление функции 'strcasecmp' strcmpi_test.c:29:2: предупреждение: нет новой строки в конце файла   -  person Max Powers    schedule 27.08.2014
comment
И еще одна вещь: логика здесь тоже не работает. я набираю те же имена боба и сравниваю с бобом, и это относится к части кода, в которой говорится, что имена не совпадают.   -  person Max Powers    schedule 27.08.2014
comment
вот вывод: введите свое имя: bob name == bob name2 == bob ваши имена НЕ совпадают   -  person Max Powers    schedule 27.08.2014
comment
Внимательно прочтите документацию для strcasecmp, уделяя особое внимание RETURN VALUE раздел.   -  person zwol    schedule 27.08.2014
comment
Спасибо за документацию. Я знаю, что будет возвращено целое число. В документации говорится следующее: функция strcasecmp() сравнивает две строки s1 и s2, игнорируя регистр символов. Он возвращает целое число, меньшее, равное или большее нуля, если найдено, что s1 соответственно меньше, соответствует или больше s2.   -  person Max Powers    schedule 27.08.2014
comment
Так зачем проверять результат ==1, когда он также может быть, по вашей же цитате, ==42 или даже странным числом ==7912? (Большой жирный совет: быть больше, чем .) (Я также только что понял, что вы тестируете весь неправильный случай, подсказка-подсказка)   -  person Jongware    schedule 28.08.2014


Ответы (1)


strcmpi не является стандартной функцией C. И компилятор сообщает, что у него нет объявления функции strcmpi.

Вы можете сами написать аналогичную функцию, используя цикл и функции toupper или tolower, декольированные в заголовке <ctype.h>

person Vlad from Moscow    schedule 27.08.2014