2015-05-20 3 views
1

Я хочу создать функцию, которая создает новую строку с определенной длиной. Это код:Проблема с созданием строки C

char* newString(int lenght){ 

    char* newstring =(char*)((calloc(lenght, sizeof(char)))); 
    newstring[lenght] = '\0'; 
    return newstring; 
} 

Я использую его таким образом:

char* string = newString(10); 

Моя проблема заключается в том, что когда я делаю:

printf("String lenght %lu \n",strlen(string)); 

я получаю 0, но я не понять почему. Я неофит с С. Благодарим за Ваше время

+1

Поскольку 'calloc' zero инициализирует ваш массив, вы никогда не заполняете его ничем. Кроме того, это написано «длина» –

+1

... и вы превысите выделенную длину с помощью 't [lenght] = '\ 0'', тем самым вызывая неопределенное поведение. Массивы в C индексируются с нулевой базой. Значение '0 ... (lenght-1)' - допустимый диапазон индексов. – WhozCraig

+0

't [length] = '\ 0';' - это не связанная запись. – Xaqq

ответ

0

Если длина не включает в себя нулевой завершение, то вы должны установить T [длина - 1] к нулю, или в качестве альтернативы calloc с длиной размера + 1.

+1

Если вы отправляете ответ, возможно, подумайте над ответом на вопрос вопроса: почему 'strlen (string)' reports' 0'. – WhozCraig

4

strlen возвращает количество символов до первого '\0'. Вы получите тот же результат, если используете:

char s[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 
int len = strlen(s); // len will be zero. 
1

Здесь есть пара вопросов. Во-первых, вы завершаете t (и я не уверен, что t-ссылки на самом деле) с нулевым терминатором в «length» индекса, который будет на один больше размера массива. Таким образом, вы получаете доступ к некоторым случайным блокам памяти. Второе неправильно использует calloc. Я думаю, что вы хотите что-то подобное:

char* new_string(int length) { 
    char* new_string; 
    new_string = malloc(sizeof(char) * length); 
    memset(new_string, 0, length); 
    new_string[length-1] = '\0'; 
    return new_string; 
} 

STRLEN в вашем примере возвращает 0, потому что он считает символы до нулевого терминатора, который бывает 0 в вашей реализации.

+0

Почему функция calloc не подходит? –

+1

Использование OP 'calloc' верное. Вы делаете то же самое, просто с большим количеством строк кода. Технически вся эта функция должна выполняться: return calloc (length, sizeof (char)); –

+0

Я знаю, что функция calloc сбрасывает память (помимо выделения памяти), функция memset делает то же самое? какие изменения? –

0

strlen подсчитывает количество символов в строке c до тех пор, пока не увидит «\ 0» (конец строки), так как ваша строка инициализирована «\ 0», ее длина равна 0. измените это значение на другое как.

memcpy(string, "good things", 10); 
    printf("%d", strlen(string)); 
Смежные вопросы