2016-09-26 3 views
1

Я пытаюсь понять, почему у меня странный характер после того, как мой printf()C: Printf символ * вернуть странный последний символ

char* extract_word() 
{ 
    char* sentences = "hi! i'm a banana!"; 
    int starts = 4; 
    int ends = 12; 
    int count; 
    int nb_char = ends-starts+1; 
    char* word = malloc(nb_char); 
    printf("\n\n%d\n",ends-starts); 
    for(count = starts; count < ends;count++) 
    { 
     word[count-starts] = sentences[count]; 
     printf("%c == \n",sentences[count]); 
    } 
    word[count-starts+1] = '\0'; 
    printf("\n\n%s",word); 
    return word; 
} 

The printf возвращений:

8 

i == 
' == 
m == 
    == 
a == 
    == 
b == 
a == 

i'm a bau 

Если убрать '\0', то я получу что-то вроде:

'm a ba¨Á£´ 

ответ

6

В коде

word[count-starts+1] = '\0'; 

off-by-one это и в основном, что вне переплете доступа вызывает undefined behavior.

Вы должны изменить свой код

word[nb_char-1] = '\0'; 

потому, что вы выделили nb_char байт, а последний индекс будет nb_char-1.

Для этого нужно проверить успешность malloc(), проверив возврат с NULL перед использованием возвращаемого указателя.

+0

Другие варианты включают слово [count-starts] = '\ 0'; '(для меня это более естественно, чем' nb_char-1', используя переменные в коде) или используя 'calloc' вместо 'malloc' –

+0

@MM Я взял ссылку на' malloc (nb_char); ', но в любом случае это просто мнение. главное - держаться в пределах. –

+0

Да. ты прав. I Вычисляет, чтобы не перезаписывать последнее назначение символа в моем цикле, я посчитал неправильным и. Спасибо за вашу помощь. –

4

Если вы удалите \0, то printf не сможет узнать, что строки заканчиваются и будет продолжать увеличивать указатель до тех пор, пока он не увидит нулевое значение, и вы рискуете получить ошибку сегментации.

Для строк без 0 в конце концов вы можете использовать snprintf

Кроме того, для чего вы пытаетесь достичь там memcpy или strncpy

чек на человека страниц для более подробной информации.

+0

Я не могу использовать string.h или любую другую библиотеку, кроме stdio.h, чтобы сделать это. Я не знал о 'snprintf'. Я прочитаю об этом. –

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