Вывести массив char, но окончание не ожидается - PullRequest
3 голосов
/ 25 февраля 2020

Я не понимаю, почему после abc появляются случайные символы. какова причина? Как распечатать только abc? Спасибо!

#include <stdio.h>

int main()
{
    char arr[3];   
    char(*ptr)[3]; // declare a pointer to an array

    arr[0] = 'a';
    arr[1] = 'b';
    arr[2] = 'c'; 

    ptr = &arr; 
    printf("%s\n", arr);
    //printf("%s\n", ptr);
    return 0;
}

enter image description here

Ответы [ 3 ]

7 голосов
/ 25 февраля 2020

Строка должна заканчиваться \0. Убедитесь, что выделено достаточно места для хранения терминатора.

#include <stdio.h>

int main()
{
    char arr[4];   
    char(*ptr)[4]; // declare a pointer to an array

    arr[0] = 'a';
    arr[1] = 'b';
    arr[2] = 'c'; 
    arr[3] = '\0'; // <-- terminator

    ptr = &arr; 
    printf("%s\n", arr);
    //printf("%s\n", ptr);
    return 0;
}

Обратите внимание, что при использовании char arr[4] в вашем массиве будет случайный контент. Если вместо этого вы используете

char arr[4] = "abc";

Это приведет к

char arr[4] = {'a', 'b', 'c', 0};

Посмотрите, как другие места заполнены 0, поэтому вам не нужно устанавливать его самостоятельно.

4 голосов
/ 25 февраля 2020

Причина случайных символов в том, что вы пытаетесь вывести массив в виде строки, используя спецификатор преобразования %s.

Но массив символов arr не содержит строку (последовательность символов, оканчивающихся нулевым символом '\0').

Таким образом, чтобы вывести его с помощью функции printf, вы можете сделать, например, следующим образом:

printf( "%*.*s\n", 3, 3, arr );

Из C Стандартный (7.21.6.1 функция fprintf)

4 Каждая спецификация преобразования вводится символом%. После% в последовательности появляется следующее:

- Необязательная точность, которая дает ... максимальное количество байтов, которое должно быть записано для преобразования s.

0 голосов
/ 25 февраля 2020

Строка должна заканчиваться на 0.
Таким образом, вы должны объявить массив из 4 элементов.

char arr[4] = "abc";

Функция strlen для всех функций семейства printf, читает строку, пока 0 значение не будет найдено. Так strlen возвращает длину блока памяти, который начинается в начале вашего массива и заканчивается первым нулем. Это может вызвать неопределенное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...