Почему спецификаторы printf,% s, печатают сразу несколько переменных?

Я объявил четыре строковых переменных и инициализировал их четырьмя разными способами. Затем я использовал функцию printf четыре раза, как следует из названия, чтобы вывести на консоль четыре строковых переменных.

Я уже пробовал печатать по одному, но это не сработало. После первой попытки я попытался использовать escape-последовательность, но это не сработало. Затем я попытался найти в Интернете правильные способы распечатать строку, но все, что я нашел, вернулось к тому же, используя функцию printf.

#include <stdio.h>
int main() {
    char name1[] = "Ignacio";
    char name2[8] = "Ignacio";
    char name3[] = {'D', 'i', 'e', 'g', 'o'};
    char name4[5] = {'D', 'i', 'e', 'g', 'o'};

    printf("Name: %s\n", name1);
    printf("Name: %s\n", name2);
    printf("Name: %s\n", name3);
    printf("Name: %s\n", name4);

    return 0;
}

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ:

Name: Ignacio
Name: Ignacio
Name: Diego
Name: Diego

ФАКТИЧЕСКИЙ ВЫХОД:

Name: Ignacio
Name: Ignacio
Name: DiegoIgnacio
Name: DiegoDiegoIgnacio

person Diego Salas    schedule 22.07.2019    source источник


Ответы (2)


Происходит то, что завершающий символ null неявно добавляется, когда вы инициализируете char [], как показано ниже:

char myStr[] ="Ignacio";

Если вы хотите инициализировать char [] отдельными символами, вы должны инициализировать его следующим образом, поскольку нулевой завершающий символ должен быть явно добавлен:

char myStr[] ={'I', 'g', 'n', 'c', 'i','0','\0'}).

Объяснение поведения в вашем случае:

Схема памяти:

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [A] [B] [C] [D] [E] [F] [10] [11]

'D' 'i' 'e' 'g' 'o' 'D' 'i' 'e' 'g' 'o' 'I' 'g' 'n' 'a' 'c' 'i' 'o' '\0'

После инициализации строк символы располагаются в памяти, как указано выше. В языке C все допустимые строки должны иметь завершающий символ NULL в конце, для специфичности, в конце строки. Причина, по которой printf просто начнется с адреса переданного ему char * и будет продолжать читать символы до тех пор, пока не встретится символ '\ 0'. Из-за этого, если вы передадите printf адрес массиву символов, который не содержит '\ 0', тогда printf продолжит движение мимо этих символов в память до тех пор, пока не встретится нулевой завершающий символ. (Это может привести к ошибке сегментации)

Объяснение вывода: (см. схему памяти выше)

Name: DiegoIgnacio

printf начнется с индекса [5] и будет печатать все символы до символа '\ 0', таким образом, выводится "DiegoIgnacio" ([5] - [11]).

Name: DiegoDiegoIgnacio

printf начнется с индекса [0] и будет печатать все символы до символа '\ 0', таким образом, выводится "DiegoDiegoIgnacio" ([0] - [11]).

person Cabbage Champion    schedule 22.07.2019

char name3[] = {'D', 'i', 'e', 'g', 'o'};
char name4[5] = {'D', 'i', 'e', 'g', 'o'};

Эти две строки не являются строками, потому что они не оканчиваются нулем.

Пытаться:

char name3[] = {'D', 'i', 'e', 'g', 'o', '\0'};
char name4[6] = {'D', 'i', 'e', 'g', 'o', '\0'};
person Yu Hao    schedule 22.07.2019