Ввод-вывод в Си

Язык Си / Ввод-вывод в Си

 

Основной задачей программирования является обработка информации, поэтому любой язык программирования имеет средства для ввода и вывода информации. В языке Си нет операторов ввода-вывода.

Ввод и вывод информации осуществляется через функции стандартной библиотеки. Прототипы рассматриваемых функций находятся в файле stdio.h. Эта библиотека содержит функции

  • printf() — для вывода информации
  • scanf() — для ввода информации.

 

Вывод информации

Функция printf() предназначена для форматированного вывода. Она переводит данные в символьное представление и выводит полученные изображения символов на экран. При этом у программиста имеется возможность форматировать данные, то есть влиять на их представление
на экране.

Общая форма записи функции printf():

 
printf("СтрокаФорматов", объект1, объект2, ..., объектn);


СтрокаФорматов состоит из следующих элементов:

  • управляющих символов;
  • текста, представленного для непосредственного вывода;
  • форматов, предназначенных для вывода значений переменных различных типов.

Объекты могут отсутствовать.

Управляющие символы не выводятся на экран, а управляют расположением выводимых символов. Отличительной чертой управляющего символа является наличие обратного слэша ‘\’ перед ним.

Основные управляющие символы:

  • ‘\n’ — перевод строки;
  • ‘\t’ — горизонтальная табуляция;
  • ‘\v’ — вертикальная табуляция;
  • ‘\b’ — возврат на символ;
  • ‘\r’ — возврат на начало строки;
  • ‘\a’ — звуковой сигнал.

 
Форматы нужны для того, чтобы указывать вид, в котором информация будет выведена на экран. Отличительной чертой формата является наличие символа процент ‘%’ перед ним:

  • %d — целое число типа int со знаком в десятичной системе счисления;
  • %u — целое число типа unsigned int;
  • %x — целое число типа int со знаком в шестнадцатеричной системе счисления;
  • %o — целое число типа int со знаком в восьмеричной системе счисления;
  • %hd — целое число типа short со знаком в десятичной системе счисления;
  • %hu — целое число типа unsigned short;
  • %hx — целое число типа short со знаком в шестнадцатеричной системе счисления;
  • %ld — целое число типа long int со знаком в десятичной системе счисления;
  • %lu — целое число типа unsigned long int;
  • %lx — целое число типа long int со знаком в шестнадцатеричной системе счисления;
  • %f — вещественный формат (числа с плавающей точкой типа float);
  • %lf — вещественный формат двойной точности (числа с плавающей точкой типа double);
  • %e — вещественный формат в экспоненциальной форме (числа с плавающей точкой типа float в экспоненциальной форме);
  • %c — символьный формат;
  • %s — строковый формат.

 
Строка форматов содержит форматы для вывода значений. Каждый формат вывода начинается с символа %. После строки форматов через запятую указываются имена переменных, которые необходимо вывести.
Количество символов % в строке формата должно совпадать с количеством переменных для вывода. Тип каждого формата должен совпадать с типом переменной, которая будет выводиться на это место. Замещение форматов вывода значениями переменных происходит в порядке их следования.
Пример на Си

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main()
{
  int a = 5;
  float x = 2.78;
  printf("a=%d\n", a);
  printf("x=%f\n", x);
  getchar();
  return 0;
}

Результат работы программы
Вывод в Си

Тот же самый код может быть представлен с использованием одного вызова printf:

1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main()
{
  int a = 5;
  float x = 2.78;
  printf("a=%d\nx=%f\n", a, x);
  getchar();
  return 0;
}

Табличный вывод

При указании формата можно явным образом указать общее количество знакомест и количество знакомест, занимаемых дробной частью:

1
2
3
4
5
6
7
8
#include <stdio.h>
int main()
{
  float x = 1.2345;
  printf("x=%10.5f\n", x);
  getchar();
  return 0;
}

Результат выполнения
Форматированный вывод в Си

В приведенном примере 10 — общее количество знакомест, отводимое под значение переменной; 5 — количество позиций после разделителя целой и дробной части (после десятичной точки). В указанном примере количество знакомест в выводимом числе меньше 10, поэтому свободные знакоместа слева от числа заполняются пробелами. Такой способ форматирования часто используется для построения таблиц.

Вывод числа с указанием количества знакомест

Ввод информации

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

 
scanf ("CтрокаФорматов", адрес1, адрес2,...);


Строка форматов аналогична функции printf().
Для формирования адреса переменной используется символ амперсанд ‘&’:
адрес = &объект

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

Пример на Си
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf
#include <stdio.h>
#include <stdlib.h> // для перехода на русский язык
int main()
{
  float y;
  system("chcp 1251"); // переходим в консоли на русский язык
  system("cls");       // очищаем окно консоли
  printf("Введите y: "); // выводим сообщение
  scanf("%f", &y);     // вводим значения переменной y
  printf("Значение переменной y=%f", y); // выводим значение переменной y
  getchar(); getchar();
  return 0;
}

Результат работы программы:
Функция scanf()

Функция scanf( ) является функцией незащищенного ввода, т.к. появилась она в ранних версиях языка Си. Поэтому чтобы разрешить работу данной функции в современных компиляторах необходимо в начало программы добавить строчку
 
#define _CRT_SECURE_NO_WARNINGS 


Другой вариант — воспользоваться функцией защищенного ввода scanf_s( ), которая появилась несколько позже, но содержит тот же самый список параметров.
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main()
{
  int a;
  printf("a = ");
  scanf_s("%d", &a);
  printf("a = %d",a);
  getchar(); getchar();
  return 0;
}


Назад: Язык Си

Комментариев к записи: 102

  • Помогите программа для вывода данных в виде таблицы, но где то ошибка не корректно выводит данные и при вводы школы букв Т, С, Д вообще перепрыгивает на шаг заголовок и примечания). Данные для ввода Тодайзи Т 220 368,8 Якусидзи С 50 54,7 Дайандзи, Д, 10, 12,2
    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
    26
    27
    28
    29
    #include <stdio.h>
    int main(void)
    {
    char name1[9], name2[9], name3[9];
    unsigned short nm1, nm2, nm3;
    float sc1, sc2, sc3;
    float cnt1, cnt2, cnt3;
    float sq1, sq2, sq3;
    printf("1. Введите: название, школу, количество, площадь  >");
    scanf("%s %c %d %f", &nm1, &sc1, &cnt1, &sq1);
    printf("2. Введите: название, школу, количество, площадь  >");
    scanf("%s %c %d %f", &nm2, &sc2, &cnt2, &sq2);
    printf("3. Введите: название, школу, количество, площадь  >");
    scanf("%s %c %d %f", &nm3, &sc3, &cnt3, &sq3);
    /* Вывод таблицы */
    /* вывод заголовков */
    printf("-----------------------------------------------\n");
    printf("| Буддийские монастыри Японии периода Нара |\n");
    printf("|---------------------------------------------|\n");
    printf("| Название | Школа | Количество |площадь земли|\n");
    printf("|          |       | монахов    | (га)        | n");
    printf("|----------|-------|------------|-------------|\n");
    /* вывод строк фактических данных */ 
    printf("| %9s | %c | %3d | %-5.1f |\n", nm1, sc1, cnt1, sq1);
    printf("| %9s | %c | %3d | %-5.1f |\n", nm2, sc2, cnt2, sq2);
    printf("| %9s | %c | %3d | %-5.1f |\n", nm3, sc3, cnt3, sq3);
    printf("-----------------------------------------------\n");
    return 0;
    }


      • объявила через char , пропускаю через компилятор не формирует таблицу правильно

        • еще nm1, nm2, nm3 описаны как unsigned short, а вводятся как строки и у cnt не тот тип. Если с типами данных всё исправить, то можно получить вот такой результат А дальше - с помощью пробелов и переносов строк в нужном месте.


  • Анастасия
    Здравствуйте! Помогите, пожалуйста, найти ошибку в выводе! При некоторых больших значениях (брала 45) программа не выводит число, хотя сохраняет его значение в переменной, проверяла через Debug. Вот программа:
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <math.h>

    int main(){
    int a[4][5];
    int i,j,range,max,maxi,maxj;
    float kproiz1,kproiz2;
    int proiz1=1;
    int proiz2=1;

    printf("введите диапазон заполнения\n");
    scanf("%d", &range);
    //if (range>=1)
    //range=range+5;
    printf ("матрица\n");
    for (i=0; i<5; i++){
        for(j=0; j<6; j++){
             a[i][j]=rand() % range+1;
             printf("%d ", a[i][j]);
        }
        printf("\n");
    }
    max = 1;
    for (i=0; i<5; i++){
        for(j=0; j<6; j++){
             if (a[i][j] > max){
                max = a[i][j];
                maxi=i;
                maxj=j;
             }
        }
    }
    printf("Максимальный элемент матрицы %d[%d;%d] \n",max,maxi+1,maxj+1);
    proiz1= proiz2 = a[maxi][maxj];
    if (maxi<=2){
        for (i=maxi+1; i<5; i++){
            if (maxj!=5){
                for(j=maxj; (j<i+1 && j!=5); j++){
                    proiz1*=a[i][j];
                }
            }
            if (maxj!=0){
                if (maxj==5){
                    proiz1=proiz1*a[i][maxj];
                }
                for(j=maxj-1; (j<i+1 && j!=0); j--){
                    proiz1=proiz1*a[i][j];
                }    
            }
        }
        kproiz1=sqrt(proiz1);
        printf("Среднее геометрическое %f \n",kproiz1);    
    }
    if (maxi>=2){
        for (i=maxi-1; i>0; i--){
            if (maxj!=5){
                for(j=maxj; (j<=i+1 && j!=5); j++){
                    proiz2=proiz2*a[i][j];
                }
            }
            if (maxj!=0){
                if (maxj==5){
                    proiz2=proiz2*a[i][maxj];
                }
                for(j=maxj-1; (j<=i+1 && j!=0); j--){
                    proiz2*=a[i][j];
                }    
            }
        }
        kproiz2=sqrt(proiz2);
        printf("Среднее геометрическое %f",kproiz2);
    }
    return 0;
    }

    • Елена Вставская
      Насколько я понимаю, проблема с выводом среднего геометрического? С большой вероятностью происходит переполнение разрядной сетки. Используйте тип long int вместо int.

  • я чайник и учу плюсы неделю от силы. помогите найти ошибку, не выводит значения:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include<stdio.h>
    #include<math.h>

    int main()
    {
    float a=8.5;
    float b=4.57;
    int c=(pow(pow(a,2)-pow(b,2),1/2));
    int p=((a+b+c)/2);
    int r=(pow((((p-a)*(p-b)*(p-c))/2),1/2));
    int y=((log(r)+pow(cos (b),2)+1.8*(exp(a-b)))/(0.15*c+r*pow(sin(b),2)));
    printf("a=%f b=%f\n", a, b );
    printf("c=%f \n", c );
    printf("p=%.3f \n", p );
    printf("r=%.3f \n", r );
    printf("y=%.3f \n", y );
    getchar();
    return 0;
    }

  • Здравствуйте у меня проблема
    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
    26
    27
    28
    29
    30
    31
    32
    #include<stdio.h>
    void  sorting(int *tmp, int ptm)
    {
     int min, curr;
      for ( int i = 0; i < ptm; i++)
      {
        min = i;
        for (int t = i + 1; t < ptm; t++)
        {

          if (tmp[t] < tmp[min])
              min = t;
        }
        curr = tmp[i];
        tmp[i] = tmp[min];
        tmp[min] = curr;
      }
    }
    int main()
    {
      int a[10];

      for (int i = 0; i < 10; i++)
      {
        printf("a%d= ", i);
        scanf("%x", &a[i]);
      }
      sorting(a,10);
      for (int i = 0; i<10; i++)
        printf("%d ", a[i]);
      return 0;
    }

    • Елена Вставская
      i должно меняться до ptm-1. Иначе t=i+1 окажется за границами массива

  • здравствуйте, столкнулась с проблемой вывода символа который соответствует 27 номеру в таблице ascii. Подскажите в чем может быть ошибка, код прилагаю:
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #include <locale.h>
    #include <iostream>
    int main()

    {
        int i, j, p, k = 5, n = 256, m = 8;

        printf("%c", 201);
        for (i = 0; i < m; i++)
        {

            for (j = 0; j < k; j++)
                printf("%c", 205);
            printf("%c", 209);
        }
        printf("\b%c", 187);
        printf("\n");

        for (i = 0; i < n / m; i++)
        {
            printf("%c", 186);
            for (j = 0; j < m; j++)
            {
                  
                    if ((i * m + j)<=0||((i * m + j)>= 7 && (i * m + j) <= 13))
                    printf("%3d- ", i * m + j);
                    
               
                    else
                    printf("%3d-%c", i * m + j, i * m + j);
                printf("%c%", 179);
            }
            printf("\b%c\n", 186);


            printf("%c", 199);
            for (j = 0; j < m; j++)
            {
                for (p = 0; p < 5; p++)
                    printf("%c", 196);
                printf("%c", 197);
            }
            if (i != (n / m - 1))
                printf("\b%c%c%c", 182, 10, 13);
            else
                printf("\b%c%c", 182, 13);

        }

        printf("%c", 200);
        for (i = 0; i < m; i++)
        {
            for (j = 0; j < k; j++)
                printf("%c", 205);
            printf("%c", 207);
        }
        printf("\b%c", 188);
    }

  • Здравствуйте, мне нужно ввести в программу число типа float с 6 цифрами до точки и 6 после. При вводе его через консоль программа получает другое число. Например, я ввожу число 123456.123456, сразу вывожу его и получаю число 123456.125000 Подскажите в чем проблема и как мне её исправить.


      • 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
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        #include <stdio.h>
        #include <math.h>
        void main()
        {
          int c, f;
          float a, y;
          c = 1;
          f = 0;
          printf("Enter a: ");
          scanf_s("%f", &a);
          for (float x = -1.7; x <= 3.3; x += 0.5)
            if ((3.0 * a) + sin(x / 3) == 0)
              f = 1;
          if (f == 0)
          {
            printf("___________________________________________\n");
            printf("|Number|  x  |       a      |     y(x)    |\n");
            printf("|______|_____|______________|_____________|\n");
            for (float x = -1.7; x <= 3.3; x += 0.5)
            {
              y = (2.0 * x) / ((3.0 * a) + sin(x / 3));
              printf("|%4d  |%5.1f|%14f|%13f|\n", c, x, a, y);
              printf("|______|_____|______________|_____________|\n");
              c++;
            }
          }
          else
          {
            printf("___________________________________________________________________________________________\n");
            for (int i = 1; i <= 12; i++)
            {
              printf("|Error: division by 0 | Error: division by 0 | Error: division by 0 | Error: division by 0|\n");
              printf("|_____________________|______________________|______________________|_____________________|\n");
            }
          }

        • Елена Вставская
          Число 123456.123456 (с такой точностью) не помещается в разрядную сетку типа float. Используйте double.

  • Вячеслав
    Если что, за код не хейтить,изучаю Си всего неделю)) Программа на отработку условных операторов) Возникла ошибка: "format '%d' expects a matching 'int' argument [-Wformat=]", Вот мой код, что делаю не верно?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <stdio.h>
    #include <conio.h>

    int main(void){
        int i;
        printf("How many money do you have? , %s\n ", i);
        scanf("Thanks now we calculate your oportunity, %d\n", i);
        if("i <= 100") {
            printf("old cucumber,milk with discount\n");
        }
        if ("i >= 300")
        {
            printf("some nuts, icecream\n");
        }
         else
        {
            printf("welcome to restoraunt\n");
        }

    • Елена Вставская
      Пишите в личку через форму на сайте или ВК. Слишком много ошибок для обсуждения в комментариях

  • Alexey Есть функция вывода строки текста на LCD: void StringS_RDX(unsigned short *str, char x, char y); Как вывести с ее помощью на LCD значение переменной? Если например я пишу StringS_RDX("12,3.4,5", 4, 4); то все выводит нормально, а если нужно вывести значение переменной, например: a=23,456; то если я пишу: StringS_RDX(*a, 4, 4); то выводит абракадабру

    • Елена Вставская
      Нужно числовое значение переменной перевести в массив символов. https://prog-cpp.ru/int-to-str/

  • Здравсвуйте, подскажите пожалуйста как вывести 10 символов (с помощью printf) К примеру Входные данные: 215 Выходные данные: SSSSSSS215 Входные данные: 9 Выходные данные: SSSSSSSSS9 Входные данные: 1000000000 Выходные данные: 1000000000

    • Елена Вставская
      Посчитать количество разрядов в числе и вычесть это значение из 10. В цикле вывести символ S нужное количество раз

  • Добрый день.Подскажите ,пожалуйста, как сделать так, чтобы при вводе числа ,например 12345, вывод был равен суме 1+2+3+4+5=15 и потом 1+5=6. Язык Си. Большое спасибо за ответ!


    • Через остаток от деления можно т.е 12345 %10 = 5 5/(10/10)=5 последняя цифра (12345 - 5) % 100 = 40 40 /(100/10) = 4 (12340- 40)%1000 = 300 300/(1000/10) = 3 (12300 - 300) /10000 = 2000 2000/(10000/10)=2 Первая цифра немного по другому 10000/10000 = 1

  • не подскажите как записать программу под данную задачу: найти площадь кольца, внутренний радиус которого равен 20, а внешний – заданному числу r (r>20).

  • Прошу подсказать как запретить ввод более одного символа. Чтобы на экране нельзя было ввести более одного символа например y или n. И далее ждать нажатия enter. Но с возможностью удалить и ввести другую букву пока не нажат enter. В интернете нашла такую программу но потеряла.

    • Елена Вставская
      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
      26
      27
      28
      29
      #include <stdio.h>
      #include <ctype.h>
      #include <conio.h>
      int main() {
        int count = 0; // количество символов
        char ch;
        char resp;
        do {
          ch = _getch(); // считывание символа без показа в консоль
          if (((ch == 'y') || (ch == 'n') || (ch == 'Y') || (ch == 'N')) && (count == 0))
          {
            resp = toupper(ch); // сохранение ответа
            putchar(resp); // вывод ответа в консоль
            count++;
          }
          else
          {
            if (ch == 8) // Backspace
            {
              if (count > 0)
              {
                count = 0;
                putchar(ch);
              }
            }
          }
        } while (ch != 13); // пока не нажали Enter
        return 0;
      }

    • Спасибо большое за программу. Работает. Единственно только при нажатии backspase введенная буква не стирается (не пропадает) с экрана. А заменяется другой буквой когда на клавиатуре нажимается другая кнопка. Немного подправила код если нажата клавиша backspase, добавила две строки. Теперь вроде работает так как я хотела.
      1
      2
      3
      4
      5
      6
      7
      if (count > 0)
              {
             count = 0;
             putchar(ch);  
          putchar(' ');
          putchar(ch);
              }

  • Здравствуйте. А каким образом вывести показания датчика на LCD дисплей? Интересует именно команда вывода не на экран монитора, а во внешнее показывающее устройство. И если датчик принимает байт данных в виде последовательности битов, то как это число перевести в десятичное и отправить на LCD?


      • LCD1602, датчик DHT11. Неужели для каждого случая своя команда вывода? Я думал, что есть типовые команды. Везде объясняют, как вывести информацию на монитор, но нигде нет про вывод на LCD; на ардуинщицких ресурсах пользуются дисплеем, но там все команды вывода уже упакованы в готовые программы.

        • Елена Вставская
          Внутри LCD1602 есть контроллер ST7066, В документации на контроллер есть весь набор команд. Для получения информации с датчика тоже требуется изучить документацию на него.

  • Доброго времени суток. Подскажите, пожалуйста, как добавить значение счётчика к строке при записи в файл? Заранее спасибо.



        • Елена Вставская
          1
          fprintf(fp, "%s %d\n", str, counter);
          fp - указатель на файл, str - строка, counter - счётчик. Я правильно поняла Вас?

  • Изучаю Си. Попалась такая задача где надо задействовать функции типа scanf и printf. Задача следующего характера: необходимо написать программу которая считывает число из 5 цифр, разделает это число на отдельные цифры и выводит эти на печать, отделяя одну цифру от другой тремя пробелами. Например ввели 42339 получили 4 2 3 3 9. Что здесь не хватает
    1
    2
    3
    4
    5
    6
    7
    8
    #include <stdio.h>
    int main(void)
    {
        int x;
        scanf ("%n", &x);
        printf ("%d\t", x);
        return 0;
    }

    • Елена Вставская
      Решения) Нужно разложить число на цифры и их вывести. Цифры находятся остатком от деления числа на 10

    • Скорее всего как массив надо решать.А так вы упустили printf для ввода этого числа или запрограммируйте его изначально


  • Валерий
    Привет Елена. Подскажите, где можно почитать более подробно, про форматированный ввод-вывод. Вот к примеру на одном форуме увидел такое: scanf("%80[^\n]", str) Это для меня, совсем непонятно. Не могу найти ничего подобного, чтоб лучше узнать.


      • Валерий
        Вот полное задание: В стандартный поток ввода подается строка, состоящая из символов, общая длина не более 80 символов. Далее входной поток заканивается. Найти какое количество раз встречается каждый символ, если он есть в строке. Результаты вывести в стандартный поток вывода. Необходимо вывести по одному значению в строку, соответствуя регламенту (см. примеры): В каждой строке результат сначала печатается сам символ, затем «равно» и кол-во раз, которое встречается этот символ. Выводить без повторений. Выводить в том порядке, в котором символ встречается в строке. every coin helps Вывод:
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        e=3
        v=1
        r=1
        y=1
        =2
        c=1
        o=1
        i=1
        n=1
        h=1
        l=1
        p=1
        s=1
        А вот код, в котором помогли сделать задание:
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        #define SIZE 128
        #define LEN 80
        int main()
        {
            char buf[LEN + 1] = "";
            int cnt[SIZE] = {0};
         
            printf( "> " );
            scanf( "%80[^\n]", buf );
         
            forchar *p = buf; *p; p++ ) 
                cnt[*p]++;
         
            forchar *p = buf; *p; cnt[*p++] = 0 )
                if( cnt[*p] != 0 )
                    printf( "%c = %d\n", *p, cnt[*p] );
         
            return 0;
        }

      • Валерий
        Елена, много перелопатив интернет, наткнулся на несколько страниц: https://www.rsdn.org/forum/cpp/1128588.1 https://www.cpp.com.ru/shildt_spr_po_c/08/0805.html https://docs.microsoft.com/ru-ru/cpp/c-runtime-library/scanf-width-specification?view=msvc-160 Сам ничего не понял, но может вам пригодится

  • Просто Ишак
    Здравия всем! Не могу понять магическую функцию scanf(), подскажите пожалуйста в чём заключается моя ошибка ...
    1
    2
    3
    4
    5
    6
    7
    8
    // в таком порядке этот кусок кода работает
    char a,h;            // так код РАБОТАЕТ (тут тип char)
    scanf("%d", &a);  // вводим число 10
    printf("%d", a);  // вывод числа 10

    scanf("%d", &h);  // вводим число 20
    printf("%d", h);  // вывод числа 20

    1
    2
    3
    4
    5
    6
    7
    // если переставить "scanf" то же код перестаёт работать нормально
    char a,h;            // так код НЕ работает
    scanf("%d", &a);  // вводим число 10
    scanf("%d", &h);  // вводим число 20

    printf("%d", a);
    printf("%d", h);  // вывод НЕПРАВИЛЬНЫЙ

    • Елена Вставская
      Такое впечатление, что scanf() с типом char и форматом ввода %d ведет себя некорректно. Есть ли возможность поменять тип переменных на int?

    • Александр
      Проблема исправлена простой расстановкой указателей.
      1
      2
      3
      4
      5
      6
      7
      8
      char a,*h;
      printf("Введите первое число: \n");
      scanf("%d", &a);  // вводим число 10
      printf("Введите второе число: \n");
      scanf("%d", &h);  // вводим число 20

      printf("Первое число: %d \n", a);
      printf("Второе число: %d", h);
      Программа сбрасывает значение первой переменной, если в памяти не выделено место для второго. Подробнее в теме про указатели.

      • Александр
        Росту уже год. Поэтому для автора не актуально. Но, возможно, кому-то другому поможет понять в чем дело. Изначально проблема в том, что scanf не знает куда (в какой тип) он читает данные. Может ориентироваться ТОЛЬКО на %d - 4 байта. Поэтому участки памяти, в которые помещаются данные накладываются и данные портятся. Александр не решил проблему, а запутал. Под второй переменной (*h) он сделал указатель на char, а любой указатель занимает 4 байта. Теперь места хватает и чтение происходит правильно. Выводит же этот указатель он не как указатель (%p), а как целое. Printf все равно что выводить, ориентируется только на %d. Эффективно это то же, что предлагала Елена - использовать int, но только очень запутано.

  • Добрый день, подскажите: как сделать ввод в формате input.txt, а вывод в формате output.txt?

  • Добрый день! Скажите, пожалуйста, как вывести числа: Два числа, первое число типа float, выровненное по левому краю, второе - беззнаковое шестнадцатеричное целое, выровненное по правому. Первое число должно быть выведено в поле, которое занимает 25 позиций, второе - 6. Первое число должно быть выведено с точностью 10. Для второго числа в выводе 10...15 необходимо использовать прописные буквы.

  • Добрый день! Подскажите пожалуйста! Такой простой код
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
    #define _CRT_SECURE_NO_WARNINGS 
    int main(void)
    {
    char ch;
    scanf("%n", &ch);
    printf ("%c", ch);
    return 0;
    }
    вместо введенного в консоли символа функция printf ("%c", ch) выводит пробел. Не пойму, почему так


  • Василиса
    В программе нужно вывести число с количеством знаков после запятой, зависящим от вводимых данных. Как, имея переменную в которой записано сколько знаков после запятой нужно вывести, вывести число с этим количеством знаков?


    • 1) с помощью sprintf(...) сформировать форматную строку с нужной точностью 2) получившуюся строку передать как аргумент для printf(...)
      Например:
      1
      2
      3
      4
      char buf[256];
      int length = 8, precision = 5;
      sprintf(buf, "Value: %%%d.%df", length, precision); // Value: %8.5d
      printf(buf, 3.14159265358979); // напечатает Value: 3.14159

  • Вместо русских символов иероглифы, хотя при компиляции ошибок нет.

    • Елена Вставская
      Попробуйте изменить шрифт в свойствах консоли (после запуска программы в верхнем левом углу меню свойств)


        • Елена Вставская
          Возможно, ошибка в строке
          system("chcp 1251");
          (русские буквы или не те символы)


    • Cherepashka68
      Попробуйте подключить библиотеку (#include <locale.h>) и в начале кода прописать команду setlocale (0, "Ukrainian")(у меня украинский, попробуйте как-то организовать русский:)


  • Спасибо огромное!) Поступил в универ а там Си. Пишите говорят проги, а как среду разработки настроить, компилятор, отсутствующие библиотеки сами разбирайтесь. Более того лекции вперемешку на Си и Си++, и там оператор ввода cin который как раз относится к Си++ и в Си при компиляции выдаёт ошибку!!!

    • Николай
      Гы гы гы! А я то думал, что я один такой разнесчастный. Ты не со ВГУЭСа часом?

  • 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #include<stdio.h>
    float summ(float a, float b);
    float minus(float a, float b);
    float multi(float a, float b);
    float diff(float a, float b);
    int main(){
      float a=1, b=1;
      int oper=1;
      printf("Enter the first number: ");
      scanf("%f", &a);
      printf("\nEnter the second number: ");
      scanf("%f", &b);
      printf("What operation do you want to make??\nEnter the appropriate number:\n 1-addition, 2-subtraction, 3-multiplication, 4-division:");
      scanf("%d", &oper);
      switch(oper){
      case 1:
        printf("Answer:%f", summ(a,b));
        break;
      case 2:
        printf("Answer:%f", minus(a,b));
        break;
      case 3:
        printf("Answer:%f", multi(a,b));
        break;
      case 4:
        if(b==0){
          printf("Division by zero is not allowed!!");
        }
        else{
        printf("Answer:%f", diff(a,b));}
        break;
      default:
        printf("Rechecks the value you entered!");
      }
      return 0;
    }
    float summ(float a, float b){
      float res=a+b;
      return res;
    }
    float minus(float a, float b){
      float res=a-b;
      return res;
    }
    float multi(float a, float b){
      float res=a*b;
      return res;;
    }
    float diff(float a, float b){
      float res=a/b;
      return res;
    }
    Подскажите пожалуйста, в чем может быть ошибка, eclips пишет c:/wascana/mingw/bin/../lib/gcc/mingw32/4.4.1-dw2/../../../../mingw32/bin/ld.exe: cannot open output file colc.exe: Permission denied

    • Елена Вставская
      Судя по тексту ошибки, Вы пытаетесь сразу запустить проект. Чтобы разобраться, в чем дело, надо проект откомпилировать без запуска (Rebuild). Тогда должны появиться сообщения, из-за чего сборка не удалась. По тексту проблем не вижу, но все компиляторы немного разные, и конкретно с Eclips для C++ я не работала.

  • Антонина
    Елена, здравствуйте! Можете пояснить для чего именно нужен макрос(?) _CRT_SECURE_NO_WARNINGS ? Если уже отвечали, дайте ссылку, пожалуйста. В гугле вменяемого объяснения не нашла. Спасибо заранее!


    • Елена Вставская
      Visual Studio последних версий при компиляции выдает ошибки на использование некоторых незащищённых функций. Это функция scanf(), копирование строки strcpy(), функции работы с файлами и прочие. Если всё-таки необходимо использовать в программе эти функции, то этой строчкой можно заставить компилятор не воспринимать использование незащищённых функций за ошибку.

  • Здраствуйте. Есть в Си такая возможность ввести в строчки вывода Шестнадцетиричный код и компилятор выведет его значение на экран т.е. Букву или спец символ. Не подскажете как точно это сделать?

  • Здравствуйте! Я только учусь программировать на Си. У меня маленькая проблемка. Я в основном программирую AVRки (Atmega). Вывод кода на 7-ми сегментники и LCD дисплеи я разобрался. А вот как вывести самый простой код "Hello World" на экране монитора не понимаю. Несколько раз переписывал код "Hello World" у разных программистов, компилил, а что делать дальше не понимаю. Объясните пожалуйста!!!

  • Елизавета
    Добрый день! пишу программу на СИ первый раз. Задача такая: даны координаты вершин треугольника. Определить: как относительно треугольника лежит начало координат. Решала через площади (дали подсказку). Но выдает неверный ответ , когда тока лежит внутри треугольника , пишет что "вне". Подскажите пожалуйста что не так(
    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
    26
    #include "math.h"
    #include "stdafx.h"
    int_tmain(int argc, _TCHAR* argv[])
    {
       float x1, y1, x2, y2, x3, y3, a, b, c, p, p1, p2, p3, s, s1, s2, s3, s0, l1, l2, l3;
       scanf("%f%f%f%f%f%f", &x1, &y1, &x2, &y2, &x3, &y3);
      a=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); //считаем стороны треугольника
      b=sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
      c=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
        l1=sqrt(x1*x1+y1*y1); // считаем расстояние от начала координат до вершин
        l2=sqrt(x2*x2+y2*y2);
        l3=sqrt(x3*x3+y3*y3);
      p=(a+b+c)/2; //вычисляем полупериметр основного треугольника
      p1=(l1+a+l2)/2;
      p2=(l2+b+l3)/2;
      p3=(l3+c+l1)/2;
       s=sqrt(p*(p-a)*(p-b)*(p-c)); //вычисляем площадь основного треугольника
       s1=sqrt(p1*(p1-l1)*(p1-a)*(p1-l2));
       s2=sqrt(p2*(p2-l2)*(p2-b)*(p2-l3));
       s3=sqrt(p3*(p3-l3)*(p3-c)*(p3-l1));
    if((s1==0) || (s2==0) || (s3==0)) printf("na storone");
    else { if (s0<=s) printf("vnutri");
           else printf("vne treugolnika");
         }
     return 0;
    }

  • всем привет) можете мне объяснить этот код мне надо пояснение этого кода. Заранее спасибо
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    // Разработать рекурсивный метод для записи числа, являющегося отражением заданного
    // натурального числа n. Пример: n=123; результат – число: 321. Выводить по одной цифре нельзя
    #include <stdio.h>
        int reverse;         
        int rev(int revNum)
        {
           if(revNum)
           {
              reverse = (reverse * 10) + (revNum % 10);
              rev(revNum/10);    //recurs vyzov
           }
           else              
            return;    //kogda obrchis raven 0 to vernutsa k abonentu
        return reverse;          
        }

       int main()
       {
           int num;
           printf("Vvesti chislo:");
           scanf("%d",&num);
           printf("Obratnoe chislo:%d\n",rev(num));
           return 0;
       }

    • Елена Вставская
      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
      26
      #include <stdio.h>
      int reverse = 0; // здесь будет число с обратным порядком цифр
      int rev(int revNum) // допустим, revNum = 123
      {
        if (revNum) // если передано число больше 0
        {
          reverse = (reverse * 10) + (revNum % 10); // reverse = reverse*10+3:
                                // 1 итерация: reverse = 0*10+3
                                // 2 итерация: reverse = 3*10+2
                                // 3 итерация: reverse = 32*10+1
          rev(revNum / 10);              // 1 итерация: вызываем функцию рекурсивно для числа 12
                                // 2 итерация: вызываем функцию рекурсивно для числа 1
                                // 3 итерация: вызываем функцию рекурсивно для числа 0 (будет выход по условию в строке 5)
        }
        return reverse;  // возвращаем полученное число
      }

      int main()
      {
        int num;
        printf("Vvesti chislo:");
        scanf_s("%d", &num);    // ввод числа
        printf("Obratnoe chislo:%d\n", rev(num)); // вывод значения, которое получено в reverse
        getchar(); getchar();
        return 0;
      }

  • Константин
    Не работает scanf на С.После ввода первой переменной с клавиатуры программа или завершает работу, или выводит некорректно посчитанные результаты бесконечно. Компилятор MinGW. Прилагаю код
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>

    int main (void) {
      char *locale = setlocale (LC_ALL, "");
      double a, b, xk, xn, deltax, y, sum, x;
      printf("Введите число a: \n");
      scanf( "%.1lf", &a);
      printf("Введите число b: \n");
      scanf("%.1lf", &b);
      printf ("Введите число xn: \n ");
      scanf("%.1lf", &xn);
      printf("Введите число xk: \n");
      scanf("%.1lf", &xk);
      printf("Введите число dx: \n");
      scanf("%.2lf", &deltax);
      printf ("\n");
        x = xn;
        y = 0.0;
        while (x>=xn & x<=xk){
          if (xb){
          y = pow(fabs((pow(x,2)-a*exp((x-b)))),(1/3.0));
                
          printf("При х = %.2lf", x);
          printf( "   y =%lf", y);
          printf("\n");  
          };
          if (x>a & x<=6){
          sum = 0.0; 
          int k;
          for (k =5;k<=12;k++){
          sum = sum + (sqrt(k) +x)/log(k);
          };
          y = sum;

          printf("При х = %.2lf", x);
          printf( "   y =%lf", y);
          printf("\r\n");  
    }
          x+=deltax;

          };
          return 0;
        }

  • георгий
    подпрограмма для вывода на экран натуральных чисел из текстового файла целых чисел в 16-ричном виде. Функцию scanf не использовать. помогите решить

    • Елена Вставская
      Функцию scanf для вывода в любом случае использовать не получится :) В чём будет заключаться помощь?


  • Правильно ли я поняла, что для ввода 4-х значного целого числа можно использовать формат %4d , т.е  scanf("%4d", &y) ?

    • Елена Вставская
      От некорректного ввода никто не застрахован, поэтому количество цифр при вводе указывать бессмысленно. Эти форматы влияют только на вывод.



    • Елена Вставская
      \t - горизонтальная табуляция - отступ, чтобы при выводе значений в несколько столбиков они выводились друг под другом. \v - вертикальная табуляция - переводит курсор на следующую строку и начинает вывод не с начала строки, а с текущей позиции, но в некоторых случаях срабатывает некорректно. \a - звуковой сигнал, который слышен при "выводе на печать" этого символа.


  • опечатка- формат не задан. нет f после y=%10.5
    1
    2
    float y=1.2345;
    printf("\n Значение переменной y=%10.5\n", y);

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *