Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
2 / 2 / 0
Регистрация: 08.09.2017
Сообщений: 9
1

Не корректно работает компилятор gcc

08.09.2017, 09:45. Показов 4232. Ответов 21

Author24 — интернет-сервис помощи студентам
изучаю язык си на линуксе. компилятор gcc. пишу простые программки. при вызове scanf ввожу значения и жму энтер, но он никак не реагирует, затем ввожу любое значение и он начинает работать с первым введенным значением. при использовании в программе нескольких scanf срабатывает только первый, остальные пропускаются и код выполняется дальше, как будто их и нет вовсе.

archlinux, в любом эмуляторе терминала работает одинаково, zsh, gcc -v 7.1.1
программа для примера
C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main()
{
double num;
printf("ввод значения: \n");
scanf("%lf", &num);
printf("\nвы ввели %lf", num);
return 0;
}
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.09.2017, 09:45
Ответы с готовыми решениями:

Компилятор (gcc 4.6) не распознает параметер-std=gnu11
Всем привет, Компилятор (gcc 4.6) не распознает параметер -std=gnu11, Кто знает в чем проблема?

gcc компилятор
есть код программы:#include &lt;limits&gt; #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;cstdlib&gt;...

gcc/c++ компилятор
в какую папку устанавливается компилятор gcc или g++ по умолчанию? Добавлено через 12 минут уже...

Компилятор gcc 4.8.1 не поддереживает C++11
Вот скрин с примером

21
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
08.09.2017, 10:08 2
В конец последнего printf'а добавь \n

И вбей себе в голову раз и на всегда одну мысль. Если тебе кажется, что неправильно работает компилятор, значит с вероятностью 99.9999999% ошибка в твоей программе
7
41 / 41 / 15
Регистрация: 29.12.2016
Сообщений: 291
08.09.2017, 14:02 3
Цитата Сообщение от kemozn Посмотреть сообщение
при использовании в программе нескольких scanf срабатывает только первый, остальные пропускаются и код выполняется дальше, как будто их и нет вовсе.
Присоединяюсь к последнему посту от EVG Чтобы корректно работали несколько scanf, после каждого добавляется getchar(), для очистки. Так как передается два значения, символ который записывается в переменную и перевод строки '\n' при нажатии кнопки "ENTER", вот как раз, чтобы такого не происходило и служит getcha(). Например:
C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main()
{
double num;
printf("ввод значения: \n");
scanf("%lf", &num);
getchar();
printf("\nвы ввели %lf", num);
return 0;
}
И так после каждого scanf
0
Вездепух
Эксперт CЭксперт С++
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,068
08.09.2017, 21:08 4
Цитата Сообщение от kemozn Посмотреть сообщение
при использовании в программе нескольких scanf срабатывает только первый, остальные пропускаются и код выполняется дальше, как будто их и нет вовсе.
В приведенном вам коде есть только один scanf, а вы нам рассказываете про несколько scanf.

Приводите реальный пример кода. В приведенном вами примере описываемых проблем нет и быть не может. (Кроме, развые что, рекомендации завершать printf переводом строки.)

И уж выдумки про "некорректно работающий компилятор gcc" тут совсем неуместны.

Добавлено через 3 минуты
Цитата Сообщение от LightProger Посмотреть сообщение
Присоединяюсь к последнему посту от EVG Чтобы корректно работали несколько scanf, после каждого добавляется getchar(), для очистки.
В этом нет никакого смысла. Никаких проблем от символа \n в буфере у scanf не будет и удалять его оттуда нет никакой необходимости. Большинство форматных спецификаторов scanf просто игнорирует ведущие пробельные символы.

Проблемы скорее возникнуть от смешения форматированного и неформатированного ввода, типа вашего getchar(). Не надо делать такого смешения без пущей необходимости.
3
41 / 41 / 15
Регистрация: 29.12.2016
Сообщений: 291
09.09.2017, 07:19 5
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В этом нет никакого смысла. Никаких проблем от символа \n в буфере у scanf не будет и удалять его оттуда нет никакой необходимости. Большинство форматных спецификаторов scanf просто игнорирует ведущие пробельные символы.
Вот реальный код, уберите отсюда getchar()ы и вы получите, что попало на выходе, Игнорирование последующих scanf, и всякую ерунду на выводе.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
 
/*
 * Программа-пример No1 из главы 8 «Руководства по С
   для новичков», 3-е издание
   Файл Chapter8ex1.c
   Эта программа-пример запрашивает у пользователей
   некоторые основные данные, после чего выводит их на
   экран, чтобы показать, что было введено
 */
 
int main()
{
  // Установка переменных, значения которым будут
  //присвоены функцией scanf()
 
  unsigned char firstInitial;
  unsigned char lastInitial;
  int age = 0;
  int favorite_number = 0;
 
  printf ("С какой буквы начинается Ваша фамилия?\n");
  scanf ("%c", &firstInitial);
  getchar();
  printf ("С какой буквы начинается Ваше имя?\n");
  scanf ("%c", &lastInitial);
  getchar();
 
  printf ("Сколько Вам лет?\n");
  scanf ("%d", &age);
  getchar();
 
  printf ("Какое Ваше любимое число(только целое)?\n");
  scanf ("%d", &favorite_number);
  getchar();
 
  printf ("\nВаши инициалы %c.%c., и Вам %d лет.", firstInitial, lastInitial, age);
  printf ("\nВаше любимое число: %d\n", favorite_number);
 
  return 0;
}
0
Вездепух
Эксперт CЭксперт С++
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,068
09.09.2017, 07:33 6
Цитата Сообщение от LightProger Посмотреть сообщение
Вот реальный код, уберите отсюда getchar()ы и вы получите, что попало на выходе, Игнорирование последующих scanf, и всякую ерунду на выводе.
Совершенно верно. Именно потому, что в данном коде используется эксклюзивный и довольно исключительный по своему поведению спецификатор формата %c, работа с которым требует определенных навыков. У автора вопрос пока никакого %c в коде видно не было.

Но, что касается вашего кода:

1. Спецификатор формата %c используется только в первых двух scanf. И этот getchar() условно "нужен" только между ними - один единственный. Все остальные getchar() можно сразу смело выкидывать из этого кода - они тут нинафиг не нужны и никакого "что попало на выходе" после их удаления мы не получим, вопреки вашим предсказаниям.

2. Правильно это делается не через какой-то непонятно откуда взявшийся getchar(), а банальной просьбой к scanf пропустить ведущие пробельные символы перед %c. Для этого перед %c надо просто вставить пробел

C
1
2
3
4
printf ("С какой буквы начинается Ваша фамилия?\n");
scanf (" %c", &firstInitial);
printf ("С какой буквы начинается Ваше имя?\n");
scanf (" %c", &lastInitial);
и вот уже никакие getchar() в этом коде стали не нужны вообще.
3
41 / 41 / 15
Регистрация: 29.12.2016
Сообщений: 291
09.09.2017, 08:25 7
TheCalligrapher, Все может быть, мне как объяснили, я так и делаю, хотя тут на форуме, еще один человек, говорит тоже самое, только он еще и в цикл это все обернул. Scanf не считывает символ
0
Evg
09.09.2017, 09:38
  #8

Не по теме:

Цитата Сообщение от LightProger Посмотреть сообщение
еще один человек, говорит тоже самое
Вероятно, много народу, говорящих одно и то же, является следствием глобальных заблуждений со стороны преподавателей. Люди ведь обучаются по одним и тем же книгам и мало кто читает точные спецификации в стандарте. У кого-то когда-то getchar помог спасти ситуацию, он рассказал об этом всем, а все с радостью подхватили, не потрудившись разобраться, как же нужно было делать правильно

0
41 / 41 / 15
Регистрация: 29.12.2016
Сообщений: 291
09.09.2017, 09:41 9
Evg, Понятно, спасибо за разъяснение.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7769 / 4598 / 2823
Регистрация: 22.11.2013
Сообщений: 13,077
Записей в блоге: 1
09.09.2017, 11:51 10
http://en.cppreference.com/w/c/io/fscanf
The format string consists of
...
whitespace characters: any single whitespace character in the format string consumes all available consecutive whitespace characters from the input (determined as if by calling isspace in a loop). Note that there is no difference between "\n", " ", "\t\t", or other whitespace in the format string.
что на великом и могучем примерно означает:
Форматная строка состоит из
...
пробельных символов: любой одиночный пробельный символ в форматной строке извлекает из входного потока все доступные последовательные пробельные символы (как-будто использован ispace() в цикле). Заметьте, нет разницы между "\n", " ", "\t" или иным пробельным символом в форматной строке.
0
Фрилансер
761 / 458 / 146
Регистрация: 06.01.2017
Сообщений: 4,856
09.09.2017, 13:32 11
+1 за смелось назвать тему о некорректности компилятора в разделе начинающих))

Цитата Сообщение от Evg Посмотреть сообщение
И вбей себе в голову раз и на всегда одну мысль. Если тебе кажется, что неправильно работает компилятор, значит с вероятностью 99.9999999% ошибка в твоей программе
+100
0
2 / 2 / 0
Регистрация: 08.09.2017
Сообщений: 9
11.09.2017, 13:18  [ТС] 12
использую вот такой вот код
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main()
{
    int num1, num2;
 
    printf("enter num1\n");
    scanf("%d\n", &num1);
    getchar();
    printf("enter num2\n");
    scanf("%d\n", &num2);
    getchar();
    printf("you entered %d and %d\n", num1, num2);
}
на выходе получаю вот такое

enter num1
5
6
enter num2
7
8
you entered 5 and 7

подскажите еще можно ли упоминать людей в сообщении? ну то есть могу ли в этом сообщении несколько людей упомянуть?
0
Фрилансер
761 / 458 / 146
Регистрация: 06.01.2017
Сообщений: 4,856
11.09.2017, 13:50 13
Цитата Сообщение от kemozn Посмотреть сообщение
подскажите еще можно ли упоминать людей в сообщении? ну то есть могу ли в этом сообщении несколько людей упомянуть?
просто кликайте на ники и все))

Добавлено через 55 секунд
Цитата Сообщение от kemozn Посмотреть сообщение
на выходе получаю вот такое
вы же _getchar() -ом еще символ считываете))
0
41 / 41 / 15
Регистрация: 29.12.2016
Сообщений: 291
11.09.2017, 14:44 14
Лучший ответ Сообщение было отмечено kemozn как решение

Решение

kemozn, В scanf перевод строки не надо указывать. scanf("%d, num1"); Вы пытаетесь вместо двух чисел, ввести 4 числа. Уберите '\n', из scanf и будет все хорошо.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7769 / 4598 / 2823
Регистрация: 22.11.2013
Сообщений: 13,077
Записей в блоге: 1
11.09.2017, 15:56 15
Возможно, вас устроит такой вариант:
C
1
2
3
4
5
6
7
8
#include <stdio.h>
void main(void)
{
    int num1, num2;
    printf("enter num1 num2: ");
    scanf(" %d %d", &num1, &num2);
    printf("you entered %d and %d\n", num1, num2);
}
0
2 / 2 / 0
Регистрация: 08.09.2017
Сообщений: 9
12.09.2017, 05:27  [ТС] 16
LightProger, спасибо.

Добавлено через 1 минуту
FateOri, как с getchar так и без него все работает одинаково
0
Фрилансер
761 / 458 / 146
Регистрация: 06.01.2017
Сообщений: 4,856
13.09.2017, 11:25 17
Цитата Сообщение от kemozn Посмотреть сообщение
FateOri, как с getchar так и без него все работает одинаково
я и проверить могу))

http://rextester.com/GIUBCZ98693
0
Вездепух
Эксперт CЭксперт С++
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,068
13.09.2017, 20:08 18
Цитата Сообщение от FateOri Посмотреть сообщение
я и проверить могу))
Это не показательная проверка, т.к. вход берется "из файла". Не видно, в каких местах программа делает "паузы".

А у реального пользователя, вводящего данные с клавиатуры, ваша программа будет вести себя "странно" и будет "необъяснимо затыкаться" при вводе именно из-за этих лишних \n в строках формата scanf.
1
2 / 2 / 0
Регистрация: 08.09.2017
Сообщений: 9
14.09.2017, 06:29  [ТС] 19
FateOri, вот кстати при использовании \n в scanf работает не так как ожидается. запрашивает лишнее раз ввод. а без него все норм, как с getchar так и без него.
0
Фрилансер
761 / 458 / 146
Регистрация: 06.01.2017
Сообщений: 4,856
14.09.2017, 19:14 20
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это не показательная проверка, т.к. вход берется "из файла". Не видно, в каких местах программа делает "паузы".
и точно

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
А у реального пользователя, вводящего данные с клавиатуры, ваша программа будет вести себя "странно" и будет "необъяснимо затыкаться" при вводе именно из-за этих лишних \n в строках формата scanf.
спасибо)

Цитата Сообщение от kemozn Посмотреть сообщение
FateOri, вот кстати при использовании \n в scanf работает не так как ожидается. запрашивает лишнее раз ввод. а без него все норм, как с getchar так и без него.
все равно вы неправы))
вот более правильный тест

http://rextester.com/PYKE96826

пробуйте сами и поймете что делает getchar))
0
14.09.2017, 19:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.09.2017, 19:14
Помогаю со студенческими работами здесь

компилятор GCC парит мозг
Вообщем проблема в том что кнопки - и + как-бы работают, но в переменную Pzad_prog постоянно...

Компилятор gcc не может найти stdio.h
Привет всем! Написал простую программу для примера из учебника. Но все время выдает ошибку. Я...

Как узнать есть ли компилятор gcc?
Приветствую. Хочу научиться программировать. Начал читать книгу &quot;Программирование в Линукс с нуля&quot;....

Как компилятор gcc установить в Ubuntu?
gnu компилятор gcc Этот надо установить в убунту


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru