Форум программистов, компьютерный форум CyberForum.ru

Вывод строки в printf - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 54, средняя оценка - 4.94
YourLastSong
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
18.03.2012, 16:23     Вывод строки в printf #1
Есть варианты кода, пытающиеся вывести строку "abc" в stdout.

C++
1
2
3
4
5
6
7
#include <stdio.h>
 
int main ()
{
    printf ("%s", "abc");
    return 0;
}
C++
1
2
3
4
5
6
7
#include <stdio.h>
 
int main ()
{
    printf ("%s", (char[]) {"abc"});
    return 0;
}
C++
1
2
3
4
5
6
7
#include <stdio.h>
 
int main ()
{
    printf ("%s", (char[]) {'a', 'b', 'c', '\0'});
    return 0;
}
C++
1
2
3
4
5
6
7
#include <stdio.h>
 
int main ()
{
    printf ("%s", (char[]) {'a', 'b', 'c'});
    return 0;
}
Почему только посл. вариант ничего не выводит на экран? Неужели всё дело лишь в терминальном нуле? Почему компилятор не может добавить его самостоятельно, как, например, во втором примере здесь? Дело в том, что, не указав размер массива явно, я сказал компилятору, что размер будет равен кол-ву элементов в списке инициализации?

Ну, даже в таком случае я думал, что printf выведет хоть что-то на экран, пусть это было бы и не то, что ожидалось.

Неужели printf сначала проверяет наличие терминального нуля в строке, которую он собирается вывести в stdout? Исходников crt под рукой нет, посмотреть не могу.

И как прав. называется конструкция вида

C++
1
(char[]) {'a', 'b', 'c'}
Создание безымянного массива фундаментального типа char размером 3 байта?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
thebvog
 Аватар для thebvog
73 / 53 / 3
Регистрация: 20.02.2012
Сообщений: 239
18.03.2012, 16:50     Вывод строки в printf #2
YourLastSong, да, дело в нуле, как раз конец строки для printf. И массив, это не строка, к нему не может ничего добавляться. В том числе и \0 как после "abc".

У меня
C++
1
printf("%s",(char[]) {'a','b','c'});
выводит строку до первого попавшегося нуля.
YourLastSong
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
18.03.2012, 16:52  [ТС]     Вывод строки в printf #3
И массив, это не строка, к нему не может ничего добавляться
Разве массив символов - это не C-string как раз?

выводит строку до первого попавшегося нуля
Но его же там нет.
thebvog
 Аватар для thebvog
73 / 53 / 3
Регистрация: 20.02.2012
Сообщений: 239
18.03.2012, 16:58     Вывод строки в printf #4
YourLastSong, массив символов это char[], а строка, которую вы выводите это указатель char* на массив символов в памяти, причём в конец "abc" ещё вставляется 0.
Кто сказал, что нет там нуля? Он будет выводит весь сегмент данных пока не встретит 0 или не будет прерван своим условием (например, длиной вывода).
YourLastSong
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
18.03.2012, 17:41  [ТС]     Вывод строки в printf #5
Он будет выводит весь сегмент данных пока не встретит 0 или не будет прерван своим условием (например, длиной вывода).
У меня ничего не выводит. Это implementation-defined?
thebvog
 Аватар для thebvog
73 / 53 / 3
Регистрация: 20.02.2012
Сообщений: 239
18.03.2012, 17:47     Вывод строки в printf #6
YourLastSong, возможно, хотя я пробовал под GCC и VC, и результат у меня, насколько помню, был один и тот же. Это чем-то напоминает прерывание DOS-a или BIOS-а для вывода строки, там так же будет выводить пока не встретит конец строки.
Yandex
Объявления
18.03.2012, 17:47     Вывод строки в printf
Ответ Создать тему
Опции темы

Текущее время: 16:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru