C ++ sprintf неправильный порядок вывода - PullRequest
2 голосов
/ 31 марта 2020

У меня есть следующий код, который должен вывести:

1234 : abcd

Однако я получаю

1234abcd : 
        char string1[4];
        sprintf(string1,"1234");

        char string2[4];
        sprintf(string2,"abcd");

        sprintf(text_string,"%s : %s",string1,string2);

Как мне заставить sprintf выводить в правильном порядке? Я попытался добавить «:» в качестве третьей строки в середине, но все равно был добавлен в конец.

1 Ответ

2 голосов
/ 31 марта 2020

У вас неопределенное поведение: sprintf() вызывает оба записи: записать пять символов (четыре символа полезной нагрузки + один завершающий нулевой байт) в массив длиной всего четыре символа. После первого вызова sprintf() все ставки выключены.


При этом происходит то, что второй вызов sprintf() перезаписывает завершающий нулевой символ, записанный первым sprintf() call, и, таким образом, последний sprintf() продолжает печатать через вторую строку, пока не найдет завершающий нулевой байт этой строки. Я понятия не имею, почему вторая строка не появляется во второй раз в выходных данных, но мне не нужно: так как у вас есть неопределенное поведение, все может произойти. В том числе появление розовых слонов ...

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