2012-02-23 2 views
0

Я читаю из сокета в массив символов, и я хочу знать, когда прекратить чтение. Конечная последовательность символов - \ r \ n \ r \ n '. Если то, что я читаю, меньше размера массива, я больше не хочу контактировать. Мой вопрос действительно, если я загружу в массив, скажем 10 символов, и он имеет длину 20, что такое индекс массива [20], установленный в?char arrays in c end char

Благодаря

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

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

+0

Предполагая, что вы имеете в виду последний индекс (массив [19]), если только массив не инициализирован до нуля, мусор ☻┬┬ *; ►E|§ – Joe

+0

Даже если массив инициализирован до нуля. Проверьте мой ответ ниже. – m0skit0

+0

C массивы основаны на нулевом значении; 'array [20]' находится вне конца массива. Предполагая, что вы имеете в виду 'array [19]', его содержимое не определено. 'memset()' массив к нулям, чтобы начать, если вы хотите, чтобы содержимое было предсказуемым. –

ответ

1

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

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

2

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

EDIT: Если вы имели в виду массив [19], то нет. Вам необходимо установить символ NUL в массив index = размер полученной строки. ASCII NUL знак '\0' не является C NULL константа, которая для 32-разрядных машин была бы 4-байтовой длиной и которая потенциально могла бы перезаписать данные.

0

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

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

1

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

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

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

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

1

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

+0

Правда. Но, как вы можете видеть из вопроса, он не знает, что такое последний персонаж. –

1

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