2016-08-01 11 views
0

Этот вопрос совершенно запутались мне-С, Хранение строку с длиной <= 60 в пространстве для массива беззнаковых целых чисел размером 15

У меня есть массив (фиксированного размера):

unsigned int i_block[15]; 

у меня есть строка (длина < = 60):

"path/to/bla/is/bla" 

Как бы идти о хранении символов строки в пространстве для массива? Я думал о возможно использовании memset, но я понятия не имею, будет ли это работать?

Для справки: «Если данные файла помещаются в пространство, выделенное для указателей на данные, это пространство удобно использовать. Например, ext2 сохраняет данные символических ссылок (обычно имен файлов) таким образом, если данные не более 60 байтов («быстрые символические ссылки») ».

из

Source

+0

'Я думал о возможно использовании memset, но я понятия не имею, будет ли это работать?' - Ну, 'memset', конечно, не будет, поскольку он предназначен для ... установки памяти на равномерное значение байта. 'memcpy' может. Попробуй. Подсказка: Стандарт позволяет писать любой тип с использованием и интерпретировать его представление с помощью указателя 'char *'. –

+3

Возможно, вам лучше повезти с 'memcpy', чем' memset'. –

+5

Знаете ли вы, что 'sizeof (int)> = 4' на вашей платформе? –

ответ

2

Этот код предполагает, что int типа использует 4 байт, следовательно, 15 int использования 60 байт.

Вы можете хранить строку таким образом:

size_t len = strlen(str); 
if (len <= sizeof i_block) { 
    memset(i_block, 0, sizeof i_block); 
    memcpy(i_block, str, len); 
} 

Массив должен быть заполнен '\0' для чистоты и обеспечить способ сказать длину строки. Вышеприведенный код прост и читабельен. Вы можете скопировать строку и просто установить оставшуюся часть буфера на 0 с чуть менее читаемым вызовом на memset.

Обратите внимание, что если длина строки равна 60, в конце массива не будет конца '\0'. Строку следует аккуратно извлекать для учета этого ограничения.

+2

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

+0

@FredLarson Я бы предпочел обработать дело позже. – user126885

+1

@FredLarson: хорошая точка, я внесла поправки. Кстати, это один из редких случаев, когда семантика 'strncpy' подходит. Тем не менее, я не буду потворствовать использованию этой функции с ошибкой. – chqrlie