2014-09-26 6 views
-2

У меня есть большой массив символов, который заполняется 0. Я читаю входящий файл из сокета и размещаю его содержимое в буфере. Я не могу написать буфер со всеми '\ 0 в нем, поэтому я выделяю новый буфер с правильным размером и записываю. Я использовал этот подход, чтобы сделать это:Удалить завершающий NULL-терминатор

int i = 0; 
while(buf[i] != '\0'){ 
    i++; 
} 
char new[i]; 
while(i){ 
    new[i] = buf[i]; 
    i--; 
} 
new[0] = buf[0]; 

Хотя этот подход работает, это не похоже, самый умный или самый элегантный способ. Каков наилучший способ удалить все конечные символы NULL из массива символов?

+1

Что вы подразумеваете под "удалить"? Все элементы массива имеют значение. Возможно, 'realloc' - это то, что вам нужно? –

+3

Я не думаю, что вы вполне поняли. Вы можете написать из буфера, который у вас есть, вам просто нужно знать его активную длину. –

+0

Я не имею в виду remove, я создаю новый буфер с разной длиной, который будет содержать файл. –

ответ

1

Я полагаю, более простой способ сделать это:

size_t len = strlen(buf); // will calculate number of non-0 symbols before first 0 
char * newBuf = (char *)malloc(len); // allocate memory for new array, don't forget to free it later 
memcpy(newBuf, buf, len); // copy data from old buf to new one 
+0

Да. Но зачем вообще выполнять эту операцию? – spencer7593

+0

@ spencer7593 имеет смысл, если исходный буфер снова используется для операций сокетов –

+0

Совершенно, я полностью забыл о strlen. –

0

Вы можете воспользоваться преимуществами свойства NULL. Просто скопируйте эти данные без символа NULL. Нравится len = strlen (buf); // он будет убедиться, что вы читаете только total_char + 1 Теперь скопируйте только len-1 char из этого буфера в файл. Если вы хотите, вы тоже можете подготовить новый буфер.

1

Моей первой идеей было бы: подсчитать символы, которые вы получаете из своего потока, а затем записать это количество байтов сразу в ваш файл.

Если это не представляется возможным, мы перейдем к менее умный подход:

int i = BUFFER_SIZE - 1; 
while((i>=0) && (buffer[i--] == '\0')); 
++i; 

После этого i содержит длину вашего буфера.

+0

Как вы написали «Я читаю входящий файл из сокета» - это могут быть произвольные данные, strlen() не будет работать корректно. Пожалуйста, уточните в будущем. – St0fF