Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.77/62: Рейтинг темы: голосов - 62, средняя оценка - 4.77
3 / 3 / 0
Регистрация: 26.09.2009
Сообщений: 104
1

Форматные функции printf() и scanf()

02.10.2009, 21:41. Показов 12495. Ответов 12

Вот читал про рсдн про эти функции.Убил моск...Помогите разобраться.

Вот она,статья:

_http://www.rsdn.ru/forum/cpp/1128588.1.aspx

Как обычно, квадратные скобки означают, что этот элемент спецификатора может отсутствовать. По сравнению со спецификатором формата для вывода только символ *(звездочка) имеет другой смысл: если она указана, то запись значения в соответствующую переменную не происходит. Например, можно определить ввод двух значений в две числовых переменных, разделяя их при вводе любым символом

C
1
2
double a,b;
scanf("%lf%*c%lf",&a,&b);
Хрень какаято ей Богу.Про звёздочку не понял.В какую,***,соответствующцую переменную,если их тут всего две ?! Последнее предложение аналогично. Каким образом тут разделять значения переменных a и b я не знаю... explode() в РНР куда проще осилить.Затем возникла головная боль о фильтрации данных.Пользователь может навводить тут чёрт знает что!
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.10.2009, 21:41
Ответы с готовыми решениями:

Printf-scanf
Добрый день, можете привести пример простого кода – вида - вопрос-ответ? чередование связки...

Странности с printf / scanf
привет всем, не могу понять в общем в чем проблема может быть есть такой кусочек кода char s;...

Scanf и printf не объявлены
#include "stdafx.h" #include <stdio.h> #include <conio.h> void main() { int i,n,b; int A,a;...

Как пользоваться scanf и printf?
Ребят,расскажите пожалуйста как пользоваться scanf() и printf().Какие там типы бывают. Буду очень...

12
1496 / 763 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
02.10.2009, 21:46 2
Зачем Вам использовать scanf printf, когда лучше и легче использовать cout cin.
0
Maniac
Эксперт С++
1457 / 958 / 159
Регистрация: 02.01.2009
Сообщений: 2,817
Записей в блоге: 1
02.10.2009, 21:56 3
Цитата Сообщение от Sergei Посмотреть сообщение
ачем Вам использовать scanf printf, когда лучше и легче использовать cout cin.
В языке С нет cout cin.
0
3 / 3 / 0
Регистрация: 26.09.2009
Сообщений: 104
02.10.2009, 22:12  [ТС] 4
Я сначала долго думал,как код на си в тег си запихать,пока не узнал о его существовани)))).Мення неправильно понимали,наверное,иногда )Такая вот проблема...

Добавлено через 10 минут
Вот ещё пример:

C
1
2
3
4
5
6
7
8
9
10
int main() {
    
int w = 7;
int p = 2;                              
float s = 77777777777777777777777777777.7;
printf("%0*.*f\n", w, p, s);
getch();
    
 
}
В результате вывелось число 77777777374014101000000000000.00.Почему ?
0
2810 / 1401 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
02.10.2009, 23:53 5
у тебя значение s вышло за пределы допустимого значения.

Цитата Сообщение от Welemir Посмотреть сообщение
printf("%0*.*f\n", w, p, s);
почитай о спецификаторах вывода printf:

Значения типов:
d, i — десятичное знаковое число, размер по-умолчанию, sizeof( int ). По-умолчанию записывается с правым выравниванием, знак пишется только для отрицательных чисел;
o — восьмеричное беззнаковое число, размер по-умолчанию sizeof( int );
u — десятичное беззнаковое число, размер по-умолчанию sizeof( int );
x и X — шестнадцатеричное число, x использует маленькие буквы (abcdef), X большие (ABCDEF), размер по-умолчанию sizeof( int );
f и F — числа с плавающей запятой. По-умолчанию выводятся с точностью 6, если число по модулю меньше единицы, перед десятичной точкой пишется 0. Величины ±∞ представляются в форме [-]inf или [-]infinity, Величина Nan представляется как [-]nan или [-]nan(любой текст далее). Использование F выводит указанные величины заглавными буквами (-INF, NAN). Аргумент по-умолчанию имеет размер double.
e и E — числа с плавающей запятой в экспоненциальной форме записи (вида 1.1e+44); e выводит символ «e» в нижнем регистре, E — в верхнем (3.14E+0);
g и G — число с плавающей запятой; форма представления зависит от значения величины (f или e);
a и A — число с плавающей запятой в шестнадцатеричном виде;
c — вывод символа с кодом, соответствующим переданному аргументу; переданное число приводится к типу unsigned char (или wint t, если был указан модификатор длины l);
s — вывод строки с нулевым завершающим байтом; если модификатор длины — l, выводится строка wchar_t*;
p — вывод указателя, внешний вид может существенно различаться в зависимости от внутреннего представления в компиляторе и платформе (например, 16 битная платформа MS-DOS использует форму записи вида FFEC:1003, 32-битная платформа с плоской адресацией использует адрес вида 00FA0030);
n — запись по указателю, переданному в качестве аргумента, количества символов, записанных на момент появления командной последовательности, содержащей n;
% — символ для вывода знака процента (%), используется для возможности вывода символов процента в строке printf, всегда используется в виде %%.
0
Эксперт С++
7175 / 3234 / 79
Регистрация: 17.06.2009
Сообщений: 14,164
03.10.2009, 00:12 6
В результате вывелось число 77777777374014101000000000000
Потому что вещественные числа представляются приближенно с помощью мантиссы и порядка. Разрядность мантиссы ограничена.
Вот сколько разрядов есть - столько и вывелось. А остальное - нули.
0
8 / 8 / 1
Регистрация: 29.09.2009
Сообщений: 28
03.10.2009, 09:54 7
Зачем Вам использовать scanf printf, когда лучше и легче использовать cout cin.
Кстати а какой синтаксис при использовании cout cin.
0
Псевдо программист
192 / 113 / 37
Регистрация: 19.09.2009
Сообщений: 303
03.10.2009, 09:57 8
у классов cout и cin перегружены операции << и >> соответственно.
Вывод: cout << переменная1 << "текст" << переменная2;
Ввод: cin >> переменная1 >> переменная2;
0
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,640
03.10.2009, 11:32 9
Цитата Сообщение от Welemir Посмотреть сообщение
double a,b;
scanf("%lf%*c%lf",&a,&b);

Хрень какаято ей Богу.Про звёздочку не понял.В какую,***,соответствующцую переменную,если их тут всего две ?! Последнее предложение аналогично. Каким образом тут разделять значения переменных a и b я не знаю... explode() в РНР куда проще осилить.Затем возникла головная боль о фильтрации данных.Пользователь может навводить тут чёрт знает что!
scanf и printf нормальные функции. Последнюю ни на какой cout не променял бы. Зачем отказываться от того, чем хорошо владеешь?
По твоему примеру
То, что между кавычек означает, что ты вводишь
%lf значит, что ты вводишь то-то и то-то (смотри, что значат спецификаторы l и f. То есть вводишь то-то и то-то или то-то ещё. Подскажу: в твоём случае ты вводишь некоторое число)
А потом ты второй раз это вводишь- видишь, ещё раз написано %lf
А меду ними %*с, что значит "любой символ".
То есть ты ввоодишь некоторое число, потом люьой симол, потом снова некоторое число.
Ну, а то, что за кавычками, означает куда ты это нечто помещаешь.
Видим адрес переменной a и адрес переменной b (&a и &b). То есть ты жмёшь некотороечисло_символ_некотороечисло_<ENTER>
Потом смотришь, что у тебя находится по адресам переменных a и b любым известным тебе способом и видишь там значения чисел, которые ты ввёл.
0
4857 / 3278 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
04.10.2009, 07:23 10
Цитата Сообщение от Welemir
Как обычно, квадратные скобки означают, что этот элемент спецификатора может отсутствовать. По сравнению со спецификатором формата для вывода только символ *(звездочка) имеет другой смысл: если она указана, то запись значения в соответствующую переменную не происходит. Например, можно определить ввод двух значений в две числовых переменных, разделяя их при вводе любым символом
Цитата Сообщение от Welemir
Хрень какаято ей Богу.Про звёздочку не понял.
это потому, что так написано

квадратные скобки могут быть и спецификатором, однако в тексте о квадратных скобках говорится так, будто они могут быть только у них в тексте

не смешивай функции printf и scanf, это разные функции, похожие только внешне
и звёздочка у них разная

у scanf звёздочка означает "читать по спецификации точно так же, как и без звёздочки, но пропустить сохранение" - поэтому для трёх спецификаций там всего две переменные, из-за того, что по второй прочитанное никуда не сохраняется, то есть, данные сохраняются только по первой и по третьей

%c - так как этот спецификатор читает любой символ (даже символ пустого пространства), то %*c читает любой символ, но не производит его сохранения в переменную

у printf звёздочка вообще по-другому работает
читай нормальные книжки
1
3 / 3 / 0
Регистрация: 26.09.2009
Сообщений: 104
04.10.2009, 13:17  [ТС] 11
Посоветуй такую книжку...по С Керниган и Ричи имхо не катит.
0
Evg
Эксперт CАвтор FAQ
21228 / 8241 / 636
Регистрация: 30.03.2009
Сообщений: 22,596
Записей в блоге: 30
04.10.2009, 14:03 12
Цитата Сообщение от Welemir Посмотреть сообщение
Хрень какаято ей Богу
Для начинающего это действительно сложно. Гемор с printf'ом в том числе является одной из причин, почему новички после паскаля считают Си гавном или считают, что Си++ лучше, чем Си, потому что там cout. Почему нельзя сделать "по-человечески" (как на паскале, например) - я затрудняюсь объяснить новичку так, чтобы было понятно. А потому просто исходи из того, что оно так должно быть, возможно со временем поймёшь.

Для всей этой группы функций используется так называемая форматная печать. Т.е. если тебе надо распечатать значения двух переменных в виде строки типа "a=5, b=10", то ты должен напечатать

C
1
printf ("a=%d, b=%d\n", a, b);
Вроде бы выглядит запутанно, но здесь уже пояснить просто. В печать подаётся строка в которой подсвечены места для печати параметров. Все подсвеченные места начинаются на символ '%'. В нашем случае эти подсвеченные места - это две подстроки "%d". В процессе работы по указанной строке происходит следующее. Печатается весь "обычный" текст - в нашем случае это "a=". Далее увидели подсвеченное место "%d", в этом месте мы читаем следующий параметр функции printf (в нашем случае это 'a', поданное после строкового выражения) и вместо "%d" напечатаем значение a. Далее опять печатаем "обычный" текст - это ", b=", далее опять на подсвеченном месте "%d" читаем следующий параметр и т.д.

Место подсветки не только показывает, где надо печатать то, что нам нужно, но и ЧТО в этом месте будет напечатано. Т.е. если ты подаёшь целочисленную переменную, то ты обязан подать один из форматов для печати целого числа, если подаёшь плавающее значение, то обязан указать формат печати для плавающего и т.п. В посте 5 расписано, какая буква что кодирует, всё это ты можешь найти в любой документации по printf'у

Примеры

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
 
int main (void)
{
  float f = 12.34567;
 
  /* '%f' означает простая печать числа в формате float или double
   * В данном случае напечатается "1.234000" */
  printf ("%f\n", f);
 
  /* '%e' означает печать числа в формате float или double в эспотенциальном виде
   * В данном случае напечатается "1.234567e+01", что следует понимать
   * как 1.234567 * 10^1 */
  printf ("%e\n", f);
 
  /* '%.02f' означает то же, что и %f, но значение округляется до 2 знаков после запятой
   * В данном случае напечатается "12.35" */
  printf ("%.02f\n", f);
 
  /* '%.02e' означает то же, что и %e, но значение округляется до 2 знаков после запятой
   * В данном случае напечатается "1.23e+01" */
  printf ("%.02e\n", f);
 
  return 0;
}
2
4857 / 3278 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
05.10.2009, 05:39 13
Цитата Сообщение от Welemir
Посоветуй такую книжку...по С Керниган и Ричи имхо не катит.
если качаешь, там практически любая не даст эффекта, надо покупать и проходить её всю
когда я качал K & R, мне казалось, что она сложная, многие на форумах говорили, что она не для новичков и что она слишком сложная, что надо начинать с простого и я купил её для будущего (заказал через ozon)
но когда я её открыл, там оказался и шрифт современный, и картинки не пропущены и вообще было многое из того, чего не было в скаченные нескольких версиях
я стал её изучать и втянулся
сейчас уже прошёл все главы, а те коды, которые писал до книги, стёр
они реально имели места вроде int n[1]; и так далее
книга учит пониманию того, как устроен язык, как устроены его детали
упражнения включают написание функций printf, scanf, fopen, fflush
мало кто знает что такое FILE *fp; книга же рассказывает как сделана FILE структура, и даёт упражнения по её разработке
malloc я ещё писал там и free
и никакие они не сложные

Добавлено через 12 минут
ещё хочу сказать, автора и книгу я выбирал по тому, что он написал
в плане не сколько миллионов книг, а в плане программ
которые я могу установить и посмотреть
сейчас, я уже, конечно, вижу в книгах по C где какой код, для ознакомления скачиваю кусок из интернета и смотрю как автор пишет и чем иллюстрирует то, что пишет
особенно, когда вижу фразы "автор золотой писатель, преподаватель, всех университетов сразу" на обложке
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.10.2009, 05:39

Не могу разобраться с printf и scanf
Написал программу:#include &lt;stdio.h&gt; int main(int argc, char ** argv) { long n; scanf(&quot;%l&quot;,...

Scanf/Printf правильность записи
Известно, что &quot;полторы кошки за полтора часа съедают полторы мышки&quot; Требуется написать программу,...

Форматы и параметры printf/scanf
Задали вопрос что если в выводе : 1) форматов&gt;переменных 2)переменных&gt;форматов Я делал...

Заменить cout и cin на printf и scanf
#include &lt;iostream&gt; using namespace std; struct elem { int info; // данные elem *next;...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru