strcasecmp в C возвращает 156 вместо 0, есть идеи, почему? - PullRequest
2 голосов
/ 25 марта 2010

У меня есть следующий код:

printf("num: %d\n", strcasecmp(buf, "h\n"));

И я получаю следующие результаты, когда пытаюсь подключить разные буквы:

a: -7
g: -1
i: 1
j: 2
h: 156
H: 156

Должно ли strcasecmp не возвращать 0, когда buf равно H или h? Есть идеи, почему возвращается 156? Мне нужно выяснить, как проверить, набирает ли пользователь H или h .

Спасибо!

Редактировать: я читаю buf следующим образом: read(0, buf, MAXBUFLEN);

Ответы [ 5 ]

5 голосов
/ 25 марта 2010
printf("num: %d\n", strcasecmp(buf, "h"));

Почему \n в конце, если вы хотите сравнить с h или H?


main(){
 char *s = "hH";
 printf("%d\n", strcasecmp(s, "Hh"));
}

0


read() также сохраняет пробелы. Так что, если вы используете read, сравните с "h \ n".

main(){
 char *buf = malloc(sizeof(char)*10);
 read(0, buf, 10);
 printf("%s %d %d\n", buf, strcasecmp(buf, "h\n"), strcasecmp(buf, "h"));
}

ч
ч
0 10

Я ввел ч в вышеуказанном случае.

Также, используйте strncasecmp, если вы хотите сравнить фиксированное количество символов.

2 голосов
/ 25 марта 2010

read не ставит ноль в конце. Он имеет дело только с массивами байтов и ничего не знает о строках с нулевым символом в конце. Так что сделайте так:

char buf[MAXBUFLEN+1];
int readResult = read(0, buf, MAXBUFLEN);
if(readResult < 0)
{
    // handle error
}
else
{
    buf[readResult] = 0;
    printf("num: %d\n", strcasecmp(buf, "h\n"));
}
2 голосов
/ 25 марта 2010

Попробуйте сравнить его с "h\r\n" - если вы в Windows, \r и \n завершат строку.

1 голос
/ 25 марта 2010

Вы пробовали

printf("num: %d\n", strcasecmp(buf, "h"));
1 голос
/ 25 марта 2010

Содержит ли buf завершающий символ новой строки?

...