char-массивы в c end char - PullRequest
       1

char-массивы в c end char

0 голосов
/ 23 февраля 2012

Я читаю из сокета в массив символов и хочу знать, когда прекратить чтение. Завершающая последовательность символов: '\ r \ n \ r \ n'. Если то, что я читаю, меньше размера массива, я больше не хочу зацикливаться. Мой вопрос на самом деле, если я загружаю в массив, скажем, 10 символов, и он имеет длину 20, какой индекс массива [20] установлен?

Спасибо

редактирование:

Извините, я имел в виду массив [19], установив последний индекс в NULL, как предложено? кажется подходящим решением. Чтобы дать более подробную информацию, мне нужно знать, когда все данные были прочитаны из сокета. Я не знаю размер данных для отправки только потому, что они заканчиваются на '\ r \ n \ r \ n'

Ответы [ 6 ]

2 голосов
/ 23 февраля 2012

Если он имеет длину 20, то массив [20] находится за пределами вашего массива и к нему нельзя обращаться подобным образом (если только вы не хотите совершать какие-то чудеса и взламывать за пределами вашего объяснения).

РЕДАКТИРОВАТЬ: Если вы имели в виду массив [19], то нет.Вам нужно установить символ NUL в индексе массива = размер полученной строки.ASCII NUL символ '\0' не является константой C NULL , которая для 32-разрядных компьютеров будет иметь длину 4 байта и потенциально может перезаписывать данные.

1 голос
/ 23 февраля 2012

Поскольку вы знаете, когда прекратить чтение, вы можете установить следующий символ в вашем массиве на '\0', чтобы отметить конец строки.

1 голос
/ 23 февраля 2012

В C, когда массив имеет неправильное расположение, массив имеет все, что осталось в неправильном фрагменте памяти.Если вы копируете несколько символов в массив и хотите, чтобы они читались как строка, вы должны установить следующий символ после последнего как «\ 0».

1 голос
/ 23 февраля 2012

Обычно во имя эффективности C не инициализирует массив каким-либо известным значением, поэтому вы получите то, что осталось в памяти.

Вы можете явно инициализировать массив, чтобы это исправить.Общей инициализацией для последовательности байтов является ноль, который не будет соответствовать вашей строке поиска и будет действовать как конец строки, если вы попытаетесь обработать массив как строку.

char array[20] = {0}; /* the extra elements are always initialized to 0 as well */
char array2[20];
memset(array2, 0, sizeof(array2));

IЯ предполагаю, что вы опечатка имели в виду array[19] вместо array[20].

1 голос
/ 23 февраля 2012

Мой вопрос на самом деле, если я загружаю в массив, скажем, 10 символов, и он имеет длину 20, каков индекс индекса [20]?

Ничего не установлено.Не стесняйтесь устанавливать это самостоятельно (например, нулевой терминатор).

0 голосов
/ 23 февраля 2012

Насколько мне известно, стандарт ANSI C не описывает, какое значение должно быть присвоено неинициализированным массивам.Считайте, что это мусор, и предположите, что ничего нельзя сказать об этом.Хотя я в основном наблюдал, что они равны 0 (используя gcc).Эта реализация может варьироваться в зависимости от компиляторов.

Кроме того, это значение может зависеть от предыдущих шагов, которые модифицировали массив [19] (как указал mOskitO, массив [20] выходит за пределы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...