printf в C со строками с более коротким инициализатором ведет себя странно - PullRequest
0 голосов
/ 19 апреля 2020

Итак, я попытался создать массивы символов и поиграться с ним.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char ** argv) {

    char str1[11] = "Yo! Angelo!~";  //total length of 12, initializer is shorter
    char str2[14] = "Yo! Angelo!233"; //total length of 14, initializer is same length
    char str3[60] = "Yo! Angelo!wwww"; //initializer is longer

    printf("%s"\n, str1);

}

компилятор предупреждает меня, что initializer-string for array of chars is too long

Я ожидал, что он даст мне только первые 11 символов str1, то есть Yo! Angelo! без '~'

, но это все три массива в строке (первый - первые 11 символов), как это

Yo! Angelo!Yo! Angelo!233Yo! Angelo!wwww (все три строки разбиты без пробела)

та же проблема все еще существует, когда я изменил инициализатор на длину 12 (такая же длина, что и строка)

также, когда я пытаюсь printf("%s\n", str2), у него аналогичная проблема - он печатает вторую и третью строку в одну строку без каких-либо значений между

, но когда я изменяю его на 13 или более, он печатает только str1, как и предполагалось.

Это не экстренный случай, и я знаю, что строка должна быть объявлена ​​длиннее, чем ее длина (в данном случае больше 13), но мне просто интересно, почему printf делает такие смешные вещи.

Спасибо ~

1 Ответ

0 голосов
/ 19 апреля 2020

Когда вы используете инициализатор строки, который слишком длинный для массива, вы теряете завершающие символы, включая завершающий NUL-терминатор. Таким образом, вы получите массивы (str1 и str2), которые не содержат строк (без NUL-терминатора), поэтому при попытке вывести его в виде строки вы получите неопределенное поведение. В частности, он печатает все, что происходит, следуя за массивом в памяти, который оказывается другими массивами.

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