2012-01-08 2 views
-1

Как определить длину массива символов, которые не имеют нулевого завершения/нулевого завершения или что-то в этом роде?(C/C++) Размер массива символов

Поскольку я написал функцию writeFile, и я хочу избавиться от этого параметра len.

int writeFile(FILE * handle, char * data, int len) 
{ 
    fseek(handle, 0, SEEK_SET); 
    for(int i=0; i <= len; i++) 
     fputc(data[i], handle); 
} 
+4

Вы не можете этого сделать, если вы просто хотите объединить эти два в 'struct' или что-то, или использовать' std :: string' или 'vector' или что-то еще, потому что ваш вопрос помечен C++. –

+4

Для C++ см. Http://stackoverflow.com/a/2404697/103167 Кстати, вы на самом деле пишете буквы len + 1'. –

ответ

3

Вы не можете избавиться от параметра len. Компьютер не является оракулом, чтобы угадать ваши намерения. Но вы можете использовать функцию fwrite(), которая будет записывать ваши данные намного эффективнее, чем fputc().

0
#define writeFile(handle, data) writeFileImpl(handle, data, sizeof data) 
+3

Что произойдет, если массив, который распался на указатель, был передан, или текстовую строку из 'malloc'? :) В этом случае я думаю, что макрос будет слишком злым, так как рано или поздно кто-то предположит, что он работает на все ... – Necrolis

+0

@Necrolis: Решение на C++, которое я связал в своем комментарии, ОПРЕДЕЛЕННО лучше, поскольку оно защищает от сообщения о размере указателя. Но если у вас должно быть что-то, что работает на C, это все. –

1

нет портативного способа *, поэтому дозорные значения как нуль терминаторов используются.

Фактически, лучше указать параметр длины, так как он позволяет частично записывать данные из буферов данных (хотя в вашем случае я использовал бы длину /std::size_t).

* Вы можете попробовать использовать _msize на окнах, но это приведет к слезам.

+1

слезы ... стрелять в голову ... прыгая с окна на 10-м этаже ... –

0

Как заметил Сейт Карнеги, и другие ответили, вы не можете этого сделать (получение длины любого массив символов).

Некоторые библиотеки C предоставить вам расширение дает оценку (более размера) длины кучи выделено памяти (например, указатели, полученные malloc).

Если вы используете Boehm's garbage collector (что очень полезно!), Оно дает вам <gc/gc.h> функцию GC_size.

Но когда массив символов находится внутри структуры или в стеке вызовов, нет способа получить его размер во время выполнения. Только ваша программа знает это.

0

Вы не можете избавиться от параметра len, если у вас нет другого способа определения длины ваших данных (обычно с использованием нулевого терминатора). Это связано с тем, что C и C++ не сохраняют длину данных. Кроме того, программисты могут оценить параметр len. Вы не всегда хотите записывать все байты в вашем массиве.

Смежные вопросы