strncmp не соответствует правильно

Я понятия не имею, как работать со строками в C:

вот часть моего сервера:
Перерыв никогда не вызывается, хотя я передаю символ ‘/’ через telnet.

В идеале это будет буферизовать строку, называемую get, добавляя к ней строку ch снова и снова, пока не достигнет определенного символа, или, что еще лучше, строки (но напишите сейчас, она должна работать с символом, но я Я хотел бы знать, как это сделать со строкой, чтобы я мог разработать протокол, который использует CR + LF в качестве разделителя).

   char ch;
int index = 0;
char get[1024];
const char str[] = "/";

if ( read( client, &ch, 1 ) < 0 )
{
perror( "read" );

get[index] = ch;
index++;

int compareResult = strncmp(str, &ch, 5);

if(compareResult == 0){
index = 0;
close( client );
printf( "server responded, connection closed" );
break;
}
}

//if ( write( client, &ch, 1 ) < 0 ) { perror( "write" ); break; }

printf( "got stuff" );

почему он не достигает

printf( "server responded, connection closed" );

линия?

полный код для сервера: http://pastebin.com/j5tX3TEx

0

Решение

Это:

int compareResult = strncmp(str, &ch, 5);

вызывает неопределенное поведение. Вы проходите &chадрес одного char к функции, ожидающей строка указатель. Таким образом, он будет рассматривать не более 5 символов, начиная с адреса &chчто, конечно, только один характер данных.

Вся ваша логика чтения очень странная, она должна читать больше, а не по одному символу за раз.

3

Другие решения

Линия

int compareResult = strncmp(str, &ch, 5);

не является правильным

ch — один символ, но вы сравниваете 5 символов. Второй аргумент должен быть строкой, а не символом.

если это опечатка и ты имел ввиду get тогда вам нужно \ 0 завершить строку после того, как вы получили последний
персонаж для того, чтобы использовать get в качестве аргумента. альтернативно использовать memcmp сравнить байты независимо от того,
они строки или нет.

2

Попробуйте это и посмотрите. Похоже, вы сравниваете массив char (str) с char (ch)

if(ch == '/'){
index = 0;
close( client );
printf( "server responded, connection closed" );
break;
}
0

Вы делаете это вместо этого:

if(ch == '/'){
index = 0;
close( client );
printf( "server responded, connection closed" );
break;
}

Это также быстрее, чем использование функции (например, strncmp)

0
read( client, &ch, 1 ) < 0

Зачем < 0? Кажется, что все сделано в вашем коде, в то время как read возвращает количество прочитанных байтов.

0
По вопросам рекламы [email protected]