Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 54, средняя оценка - 4.94
YourLastSong
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
#1

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

18.03.2012, 16:23. Просмотров 7821. Ответов 5
Метки нет (Все метки)

Есть варианты кода, пытающиеся вывести строку "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 байта?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2012, 16:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вывод строки в printf (C++):

Вывод строки фиксированной длинны в cout (аля printf(%5.0d)! - C++
Добрый вечер! Сегодня встал перед выбором... как выводить через printf или cout. Через принтф код выдает ошибку: Необработанное...

Вывод printf - C++
Здравствуйте! Почему не выводится средний столбец? #include &lt;conio.h&gt; #include &lt;stdio.h&gt; void SummFactorial(int n) ...

Странный вывод printf - C++
Есть код: struct Player { string Name; double HP; }; int main() {

Переписать вывод с использованием printf - C++
как написать эту часть через printf int b=0; float sr; cout &lt;&lt;&quot;ucheniki y kotorix net 3: &quot;&lt;&lt;&quot;\n&quot;; for(i=0;i&lt;a;i++) ...

Форматированный вывод с использованием printf() - C++
Как сделать, чтобы printf(&quot;%3.3f&quot;, peremennaya); выводила именно 3.3 знака, даже если число хранимой в этой переменной такого количества...

Происходит вывод лишней цифры в printf - C++
Задается значение k равное g, то на выходе получается: 103 3. При этом если поставить пробел в кавычка (здесь &quot;%d\n&quot;), то вторым...

5
thebvog
73 / 53 / 3
Регистрация: 20.02.2012
Сообщений: 239
18.03.2012, 16:50 #2
YourLastSong, да, дело в нуле, как раз конец строки для printf. И массив, это не строка, к нему не может ничего добавляться. В том числе и \0 как после "abc".

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

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

Ввод\вывод одномерного массива (printf) - C++
Одномерный массив x с 4-мя элементами Ввод идет нормально, а вот вывод - всегда 0, в чем проблема? #include &lt;stdio.h&gt; #define N 4 ...

Вывод long double с используя printf() - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; long double R(int n, int r) { long double sq = (long double) sqrt((long double)r*r -...

Вывод данных с помощью функции printf() - C++
Помогите пож: Задано определенный символ. Написать выражение который проверяет этот ли символ с цифрой. Язык С. Вывод данных с помощью...

Как в Си перенаправить стандартный вывод printf? - C++
Нужно сделать чтоб функция printf выводила данные на некоторое нестандартное устройство. То есть перенаправление стандартных потоков не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.