Как вывести массив через пробел в Си?
У меня есть «двумерный» массив. Нужно вывести его на экран, чтобы в строчке каждый элемент отделялся пробелом. Что нужно изменить в коде?
printf(«Ishodnyi massiv:\n»);
for (i=0; i[j]);
printf(«\n»);>
С таким кодом выводятся все элементы просто подряд, склеенные.
Дополнен 12 лет назад
Дополнен 12 лет назад
printf(«Ishodnyi massiv:\n»);
for (i=0; i[j]);
printf(«\n»);>
Дополнен 12 лет назад
Василий, спасибо. Вот это «\t» мне и нужно было!
Дополнен 12 лет назад
И. А. Голованев, спасибо, буду знать.
Лучший ответ
printf(» %d», A); %d- это для int, заменяеш на то что надо (там f для float или s для char), а A просто пример масива.
Кстате если в принтф поставить в ковычках там \a то прикол будет. Проверь и увидиш.
Остальные ответы
в формате принтфа пробел как раз и даёт пробел на выводе
типа
printf(«%d «, x);
после вывода x по проценту как раз пробел в формате вывода
А про «весь код»:
чтоб сюда нормально код пролез надо «< " и "[ " писать с пробелом
————
А «\t» это не пробел а табуляция
Похожие вопросы
Ваш браузер устарел
Мы постоянно добавляем новый функционал в основной интерфейс проекта. К сожалению, старые браузеры не в состоянии качественно работать с современными программными продуктами. Для корректной работы используйте последние версии браузеров Chrome, Mozilla Firefox, Opera, Microsoft Edge или установите браузер Atom.
Как поставить пробел в cout? C++ [закрыт]
Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.
Вопрос вызван проблемой, которая больше не воспроизводится, или опечаткой. Хотя похожие вопросы могут быть уместны на этом сайте, решение для этого вопроса вряд ли поможет будущим посетителям. Обычно можно избежать подобных вопросов написанием и исследованием минимальной программы для воспроизведения проблемы до публикации вопроса.
Закрыт 2 года назад .
#include using namespace std; int main() < int x, result, result1; cin >> x; result = x / 10; result1 = x % 10; cout
Перешёл на C++ с питона буквально пару дней назад, туплю иногда, но сейчас просто не знаю как сделать пробел в cout, чтобы в результате было — 2 3, а не 23. Помогите, пожалуйста.
ввод данных
char *fgets(char *str, int num, FILE *stream) — читает до num-1 символов или пока не встретится ‘\n’ или EOF из потока stream и помещает их в массив символов, на который указывает str. По окончании считывания в массив str сразу после последнего считанного символа помещается нулевой символ.
! Символ ‘\n’ после чтения меньше чем num-1 станет частью массива str.
При вызове fgets(ptr, N — 1, stdin);
где объявлено char ptr[N];
Для различных типов данных используется функция scanf()
int scanf(const char *управляющая_строка, . ); — читает и интерпретирует вводимые пользователем символы в зависимости от управляющей строки
и возвращает количество тех элементов данных, которым было успешно присвоено значение и в случае ошибки EOF.
НО оставляет после себя символы во входном потоке.
Так как читает либо до первого разделителя (‘ ‘, ‘\n’, ‘\t’) либо заданное число символов
При попытке игнорировать разделители, например, scanf(«%d\n», &n) ведет себя по-разному в зависимости реализации стандартной библиотеки, так в VisualStudio будет ждать первого отличного от разделителя (‘ ‘, ‘\n’, ‘\t’) символа , который также останется в очереди ввода и будет считан уже следующей функцией ввода.
Поэтому лишние символы ввода после scanf(..) для корректной работы нужно «забрать», например, fgets(str, N — 1, stdin);
и если уверены, что останется только один символ getchar();
Управляющая строка состоит из символов трех видов:
- спецификаторов преобразования,
- разделителей (пробел, перевод строки, табуляция),
- других символов, не являющихся разделителями.
Спецификаторы преобразования
В отличие от scanf scanf_s требу ет , чтобы вы указали размеры буфера для некоторых параметров. Укажите размеры для всех параметров со спецификаторами %c , %C , %s , %S или набора элементов управления строкой [] . Размер буфера в символах передается как дополнительный параметр в функции scanf_s . Он следует сразу за указателем на буфер или переменную.
ИЛИ явно scanf_s(«%1c», &c);
Подробно об использовании scanf
Ввод чисел
Для чтения целого числа используйте спецификатор преобразования %d или %i. A для чтения числа с плавающей точкой, представленного в стандартном или экспоненциальном виде, используйте спецификатор преобразования %e, %f или %g. (Кроме того, для чтения числа с плавающей точкой стандарт С99 разрешает использовать также спецификатор преобразования %a.)
Функцию scanf() можно использовать для чтения целых значений в восьмеричной или шестнадцатеричной форме, применяя для этого соответственно команды форматирования %o и %x, последняя из которых может быть как на верхнем, так и на нижнем регистре. Когда вводятся шестнадцатеричные числа, то буквы от А до F, представляющие шестнадцатеричные цифры, должны быть на том же самом регистре, что и литера-спецификатор. Следующая программа читает восьмеричное и шестнадцатеричное число:
Функция scanf() прекращает чтение числа тогда, когда встречается первый нечисловой символ.
Ввод целых значений без знака
Для ввода целого значения без знака используйте спецификатор формата %u. Например, операторы
выполняют считывание целого числа без знака и присваивают его переменной num.
Чтение одиночных символов с помощью scanf()
Как уже говорилось в этой главе, одиночные символы можно прочитать с помощью функции getchar() или какой-либо функции, родственной с ней. Для той же цели можно использовать также вызов функции scanf() со спецификатором формата %c. Но, как и большинство реализаций getchar(), функция scanf() при использовании спецификатора преобразования %c обычно будет выполнять построчно буферизованный ввод. В интерактивной среде такая ситуация вызывает определенные трудности.
При чтении одиночного символа символы разделителей читаются так же, как и любой другой символ, хотя при чтении данных других типов разделители интерпретируются как разделители полей. Например, при вводе с входного потока «x y» фрагмент кода
помещает символ x в a, пробел — в b, а символ y — в c.
Чтение строк
Для чтения из входного потока строки можно использовать функцию scanf() со спецификатором преобразования %s. Использование спецификатора преобразования %s заставляет scanf() читать символы до тех пор, пока не встретится какой-либо разделитель. Читаемые символы помещаются в символьный массив, на который указывает соответствующий аргумент, а после введенных символов еще добавляется символ конца строки (‘0’). Что касается scanf(), то таким разделителем может быть пробел, разделитель строк, табуляция, вертикальная табуляция или подача страницы. В отличие от gets(), которая читает строку, пока не будет нажата клавиша , scanf() читает строку до тех пор, пока не встретится первый разделитель. Это означает, что scanf() нельзя использовать для чтения строки «это испытание», потому что после пробела процесс чтения прекратится. Чтобы увидеть, как действует спецификатор %s, попробуйте при выполнении этой программы ввести строку «привет всем»:
printf(«Вот Ваша строка: %s», str);
Программа выведет только часть строки, то есть слово привет.
Ввод адреса
Для ввода какого-либо адреса памяти используйте спецификатор преобразования %p. Этот спецификатор преобразования заставляет функцию scanf() читать адрес в том формате, который определен архитектурой центрального процессора. Например, следующая программа вначале вводит адрес, а затем отображает то, что находится в памяти по этому адресу:
printf(«По адресу %p находится %c\n», p, *p);
Спецификатор %n
Спецификатор %n указывает, что scanf() должна поместить количество символов, считанных (до того момента, когда встретился %n) из входного потока в целую переменную, указанную соответствующим аргументом.
Использование набора сканируемых символов
Функция scanf() поддерживает спецификатор формата общего назначения, называемый набором сканируемых символов (scanset). Набор сканируемых символовпредставляет собой множество символов. Когда scanf() обрабатывает такое множество, то вводит только те символы, которые входят в набор сканируемых символов. Читаемые символы будут помещаться в массив символов, который указан аргументом, соответствующим набору сканируемых символов. Этот набор определяется следующим образом: все те символы, которые предстоит сканировать, помещают в квадратные скобки. Непосредственно перед открывающей квадратной скобкой должен находиться знак %. Например, следующий набор сканируемых символов дает указание scanf() сканировать только символы X, Y и Z:
При использовании набора сканируемых символов функция scanf() продолжает читать символы, помещая их в соответствующий массив символов, пока не встретится символ, не входящий в этот набор. При возвращении из scanf() в массиве символов будет находиться строка, состоящая из считанных символов, причем эта строка будет заканчиваться символом конца строки. Чтобы увидеть, как это все работает, запустите следующую программу:
char str[80], str2[80];
printf(«%d %s %s», i, str, str2);
Введите 123abcdtye, а затем нажмите клавишу . После этого программа выведет 123 abed tye. Так как в данном случае ‘t’ не входит в набор сканируемых символов, то scanf() прекратила чтение символов в переменную str сразу после того, как встретился символ ‘t’. Оставшиеся символы были помещены в переменную str2.
Кроме того, можно указать набор сканируемых символов, работающий с точностью до наоборот; тогда первым символом в таком наборе должен быть ^. Этот символ дает указание scanf() принимать любой символ, который не входит в набор сканируемых символов.
В большинстве реализаций для указания диапазона можно использовать дефис. Например, указанный ниже набор сканируемых символов дает функции scanf()указание принимать символы от А до Z:
Следует обратить внимание на такой важный момент: набор сканируемых символов чувствителен к регистру букв. Если нужно сканировать буквы и на верхнем, и на нижнем регистре, то их надо указывать отдельно для каждого регистра.
Пропуск лишних разделителей
Разделитель в управляющей строке дает scanf() указание пропустить в потоке ввода один или несколько начальных разделителей. Разделителями являются пробелы, табуляции, вертикальные табуляции, подачи страниц и разделители строк. В сущности, один разделитель в управляющей строке заставляет scanf()читать, но не сохранять любое количество (в том числе и нулевое) разделителей, которые находятся перед первым символом, не являющимся разделителем.
Символы в управляющей строке, не являющиеся разделителями
Если в управляющей строке находится символ, не являющийся разделителем, то функция scanf() прочитает символ из входного потока, проверит, совпадает ли прочитанный символ с указанным в управляющей строке, и в случае совпадения пропустит прочитанный символ. Например, «%d,%d» заставляет scanf()прочитать целое значение, прочитать запятую и пропустить ее (если это была запятая!), а затем прочитать следующее целое значение. Если же указанный символ во входном потоке не будет найден, то scanf() завершится. Когда нужно прочитать и отбросить знак процента, то в управляющей строке следует указать %%.
Функции scanf() необходимо передавать адреса
Для всех переменных, которые должны получить значения с помощью scanf(), должны быть переданы адреса. Это означает, что все аргументы должны быть указателями. Вспомните, что именно так в С создается вызов по ссылке и именно тогда функция может изменить содержимое аргумента. Например, для считывания целого значения в переменную count можно использовать такой вызов функции scanf():
Строки будут читаться в символьные массивы, а имя массива без индекса является адресом первого его элемента. Таким образом, чтобы прочитать строку в символьный массив, можно использовать оператор
В этом случае str является указателем, и потому перед ним не нужно ставить оператор &.
Модификаторы формата
Как и printf(), функция scanf() дает возможность модифицировать некоторое число своих спецификаторов формата. В спецификаторах формата моно указать модификатор максимальной длины поля. Это целое число, расположенное между % и спецификатором формата; оно ограничивает число символов, считываемых из этого поля. Например, чтобы считывать в переменную str не более 20 символов, пишите
Если поток ввода содержит больше 20 символов, то при следующем вызове функций ввода считывание начнется после того места, где оно закончилось при предыдущем вызове. Например, если вы в ответ на вызов scanf() из этого примера введете
то в str из-за спецификатора максимальной ширины поля будет помещено только 20 символов, то есть символы вплоть до Т. Это значит, что оставшиеся символы UVWXYZ пока еще не прочитаны. При следующем вызове scanf(), например при выполнении оператора
в str будут помешены буквы UVWXYZ. Ввод из поля может завершиться и до того, как будет достигнута максимальная длина поля — если встретится разделитель. В таком случае scanf() переходит к следующему полю.
Чтобы прочитать длинное целое, перед спецификатором формата поместите l (эль). А для чтения короткого целого значения перед спецификатором формата следует поместить n. Эти модификаторы можно использовать со следующими кодами форматов: d, i, o, u, x и n.
По умолчанию спецификаторы f, e и g дают scanf() указание присваивать данные переменной типа float. Если перед одним из этих спецификаторов будет помещен l (эль), то scanf() будет присваивать данные переменной типа double. Использование L дает scanf() указание, чтобы переменная, принимающая данные, имела тип long double.
Если в компиляторе предусмотрена обработка двухбайтовых символов [1] , добавленных в язык С Поправкой 1 от 1995 года, то модификатор l можно также использовать с такими кодами формата, как c и s. l непосредственно перед c является признаком указателя на объект типа wchar_t. А l непосредственно перед s — признак указателя на массив элементов типа wchar_t. Кроме того, l также применяется для модификации набора сканируемых символов, чтобы этот набор можно было использовать для двухбайтовых символов.
В Стандарте С99, кроме перечисленных, предусмотрены также модификаторы ll и hh, последний из которых можно применять к спецификаторам d, i, o, u, xили n. Он является признаком того, что соответствующий аргумент является указателем на значение, типа signed или unsigned char. Кроме того, к спецификаторам d, i, o, u, x и n можно применять и ll, этот спецификатор является признаком того, что соответствующий аргумент является указателем на значение типа signed (или unsigned) long long int.
Подавление ввода
scanf() может прочитать поле, но не присваивать прочитанное значение никакой переменной; для этого надо перед литерой-спецификатором формата поля поставить звездочку, *. Например, когда выполняется оператор
можно ввести пару координат 10,10. Запятая будет прочитана правильно, но ничему не будет присвоена. Подавление присвоения особенно полезно тогда, когда нужно обработать только часть того, что вводится.
Функция printf
Для вывода данных в языке C используется функция printf . Для использования этой функции необходимо подключить заголовочный файл stdio.h :
Если вы пишете на C++, то лучше подключать файл cstdio :
Функция printf получает один или более аргументов. Первый аргумент — строка, которую нужно вывести. Например, если нужно просто вывести какой-то текст, то можно написать так:
Символ ‘\n’ в конце вывода означает символ перехода на новую строку.
Если нужно вывести значения какой-то переменной, то в форматной строке вместо этой переменной указывается специальное выражение, начинающееся с символа «%». Например, для вывода целого числа типа int указывается строка «%d». Сами переменные указываются после форматной строки, следующими параметрами, передаваемыми функции printf .
Например, чтобы напечатать значения переменных a и b типа int через пробел можно использовать следующую функцию:
Выводимые типы
Перечислим разные типы данных, которые можно выводить при помощи функции printf и соответствующие им форматные строки.
| %d или %i |
Выводится целое число (значение типа int) в десятичной системе счисления. Для вывода значений типа short int используется %hd, long int — %ld, long long int — %lld. |
| %u | Выводится беззнаковое целое число (значение типа unsigned int) в десятичной системе счисления. Для вывода значений типа unsigned short используется %hu, unsigned long — %lu, unsigned long long — %llu. |
| %e | Выводится значение типа double в экспоненциальной форме, например, число 123.456 будет выведено в виде 1.234560e+002. Для вывода значения типа double также используется %le, для вывода long double — %Le (в Windows может не работать). |
| %f | Выводится значение типа double с фиксированной точкой. Например, число 1e20 будет выведено, как 10000000000.000000. Для вывода значения типа double также используется %lf, для вывода long double — %Lf (в Windows может не работать). |
| %g | Значение типа double выводится либо с фиксированной точкой, либо с плавающей точкой, в зависимости от величины числа. Аналогично используется %lg для double и %Lg для long double. |
| %c | Выводится один символ (значение типа char). |
| s | выводится содержимое C-строки. В качестве параметра передается указатель char * или массив символов char[]. |
| %% | Вывести один символ %, никакого значения переменной при этом не передается. |
Значения целых чисел также можно выводить в восьмеричной или шестнадцатеричной системах счисления.
Обратите внимание, переменную типа float вывести при помощи функции printf нельзя (можно привести значение типа float к типу double и вывести его).
В операционной системе Windows не рекомендуется использовать тип long double.
Модификаторы длины
Эти модификаторы пишутся между знаком % и символом, обозначающим тип. Например, %lld. Эти модификаторы используются для того, чтобы вывести значения типов short int, long int , long double и т.д. и уже упоминались раньше.
Используется для значения типа long int или unsigned long int вместе с модификаторами d, i, u.
Используется для значения типа double вместе с модификаторами e, f, g.
Ширина поля вывода
После знака % можно задать ширину поля для вывода в виде целого числа (не начинающегося с нуля). В этом случае число вывод этого числа будет занимать указанное число символов. Если в числе меньше цифр, чем заданная ширина поля вывода, то перед числом (слева) выводятся пробелы. Если же в числе больше цифр, чем ширина поля, то выводятся все цифры (то есть выводится больше цифр, чем вся ширина поля, поле расширяется, чтобы вывести все символы).
Если перед шириной поля поставить цифру 0, например, «%010d», то число будет дополняться слева не пробелами, а нулями. Это удобно, например, для вывода времени в формате hh:mm, что можно сделать, например, так:
printf(«%02d:%02d», h, m);
Если перед шириной поля поставить знак «-«, то число будет дополняться пробелами не слева, а справа (сначала выводится число, потом — дополнительные пробелы до заполнения всего поля).
Также вместо ширины поля вывода можно указать символ «*» (звездочка), тогда значение ширины поля вывода нужно передать в качестве дополнительного параметра. Например, запись:
означает вывести значение переменной a используя поле шириной n символов.
Точность вывода действительных чисел
По умолчанию действительные числа выводятся с 6 знаками после точки, при этом числа в экспоненциальной форме выводятся в виде одной цифры, точки и 6 цифр после точки (и показателя степени).
Для изменения точности вывода действительных чисел в форматной строке указывается символ точки (‘.’) и после нее число — количество выводимых знаков после точки. Например, так:
Вывод целых чисел со знаком +/-
Если при выводе целого числа в форматной строке задать символ «+», то положительные числа будут выводиться с обязательным знаком «+» перед ними.
Большинство перечисленных выше параметров комбинируются друг с другом. Например, такая строка:
означает вывод числа типа long long, со знаком «+» или «-» перед числом, с добавлением нулей таким образом, что общее число выводимых символов будет не меньше 20.