У меня проблемы с чтением из гнезда. Код, который я использую, ниже, иногда он работает отлично, но в других случаях он просто печатает некоторые нечитаемые символы или некоторые случайные читаемые ... есть ли лучший способ?Чтение из гнезда в C дает странный вывод
char* answer = (char*) malloc(1024);
int answerLength = 0;
char prevChar = 0;
char newChar = 0;
while (answerLength < 1024 && read(sock, &newChar, 1) > 0) {
if (newChar == '\n' && prevChar == '\r') {
break;
}
printf("%d\n", answerLength);
answer[ answerLength ] = newChar;
answerLength++;
prevChar = newChar;
}
printf("%s\n", answer);
в C, не отбрасывать возвращаемое значение из malloc() (и семейства функций). «Магические» номера, такие как «1024», должны быть #defined, чтобы значительно облегчить бремя отладки и последующего обслуживания. #define name (go style style says: all caps) должно указывать на то, что 1024 означает – user3629249
относительно этой строки: 'if (newChar ==' \ n '&& prevChar ==' \ r ') {' OS/компилятор будет обрабатывать разницу между окончаниями строк ОС (в некоторых ОС используется только линейная передача, в некоторых ОС используется только возврат каретки, а в некоторых ОС используется строка с несколькими символами). Компилятор будет обрабатывать детали, поэтому код должен использовать только '\ n' – user3629249
предлагают использовать calloc(), а не malloc, поэтому выделенная память «уже» инициализируется ко всем '' \ 0 ', поэтому не стоит беспокоиться о добавлении нулевого терминатора во входную строку. BTW: когда answerLength 1023, следует остановить , не добавляйте еще один символ, так как добавление символа приведет к тому, что буфер ответа будет иметь место для завершения строки NUL char – user3629249