Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 14.09.2019
Сообщений: 57

Код срабатывает два раза

13.12.2019, 17:49. Показов 2836. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Данный код в одном месте срабатывает не так как ожидалась.
Первый раз код срабатывает правильно, но потом тут же срабатывает второй раз,
и к тому же не выполняет одну строку кода.
Вот сама программа:
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
// Запрос символа и выдача случайного числа
#include <stdio.h>
#include <stdlib.h>
 
int main(void) {
    char choice;
 
    int rand_num;
 
    printf("Guess the number from 1 to 100\n"); // Первый запрос числа
 
    choice = getchar();
    rand_num = 1 + rand() % 101;
 
    printf("Random Number: %d\n\n", rand_num);
 
    while (choice != '#') {
            printf("Guess the number from 1 to 100\n"); // Этот код срабатывает два раза
 
            scanf("%c", &choice); // На второй раз эта строчка кода не срабатывает
            rand_num = 1 + rand() % 101;
 
            printf("Random Number: %d\n\n", rand_num);
    }
    
    printf("It\'s the end!\n");
 
    return 0;
}
Я никак не могу понять, что я делаю не так.

Вот вывод командной строки(Windows 10):

Guess the number from 1 to 100
d
Random Number: 42 Guess the number from 1 to 100
Random Number: 86
Guess the number from 1 to 100
f
Random Number: 73

Guess the number from 1 to 100
Random Number: 39

Guess the number from 1 to 100
d
Random Number: 81

Guess the number from 1 to 100
Random Number: 70
Guess the number from 1 to 100
#
Random Number: 66
It's the end!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.12.2019, 17:49
Ответы с готовыми решениями:

Только одна цифра в числе встречается ровно два раза, остальные - не более одного раза,вывести сумму этих цифр
]Только одна цифра в числе встречается ровно два раза, остальные - не более одного раза,вывести сумму этих чисел вообщем я написал...

Как не вводить строку два раза?
нужна помощь с этой программой: #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;string.h&gt; #include &lt;stdlib.h&gt; // фильтр...

Последний байт выводится два раза с feof()
Последний байт выводится два раза (ну и размер, конечно на 1 больше реального выводится. Объясните пож. почему такое происходит? ...

5
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,916
13.12.2019, 18:31
Пальцем в небо: А вы учитываете, что getchar и scanf("%c",...) считают '\n' символом, а не разделителем?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
13.12.2019, 18:40
KarKarasik, распечатывай то, что вводишь. Твою choice. Тогда, возможно, кое что станет понятным...

Добавлено через 3 минуты
Например, так
C
1
2
3
printf("Guess the number from 1 to 100\n"); 
scanf("%c", &choice); 
printf("choice=%c(%d)\n", choice, choice);
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
13.12.2019, 18:57
Лучший ответ Сообщение было отмечено KarKarasik как решение

Решение

KarKarasik, '\n' остается в потоке, а возможно, и что-то большее, если ввести более одного символа.
Я бы еще и слегка переделал:
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
#include <stdio.h>
#include <stdlib.h>
 
int main(void) 
{
    char choice;
 
    int rand_num;
 
    do
    {
        printf("Guess the number from 1 to 100\n"); // запрос числа
 
        choice = getchar();
        
        scanf("%*[^\n]"); //очищаем входной поток до символа '\n'
        scanf("%*c"); //убираем из потока символ '\n'
 
        rand_num = 1 + rand() % 101;
 
        printf("Random Number: %d\n\n", rand_num);
    } while (choice != '#');
 
    printf("It\'s the end!\n");
 
    return 0;
}
1
0 / 0 / 0
Регистрация: 14.09.2019
Сообщений: 57
13.12.2019, 20:44  [ТС]
Консоль выводит:
Guess the number from 1 to 100
d
Random Number: 42
Guess the number from 1 to 100
choice ==
(10)Random Number: 86
Guess the number from 1 to 100
s
choice ==
s(115)Random Number: 73 Guess the number from 1 to 100
choice ==
(10)Random Number: 39
Guess the number from 1 to 100
a
choice == a(97)Random Number: 81 Guess the number from 1 to 100
choice ==
(10)Random Number: 70 Guess the number from 1 to 100

Добавлено через 1 минуту
На счет '\n', я знаю, что getchar() это считывает, проблема в том, что я не знаю как это предотвратить.

Добавлено через 4 минуты
liv, спасибо, что помогли.
Но я бы хотел узнать, что это за магия вне хогвартса:
C
1
2
scanf("%*[^\n]");
scanf("%*c");
Я такого никогда не встречал, и в интернете про это информации нет.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
13.12.2019, 21:01
Лучший ответ Сообщение было отмечено KarKarasik как решение

Решение

Цитата Сообщение от KarKarasik Посмотреть сообщение
я не знаю как это предотвратить.
Один из способов - вводить не символ, а строку. Она будет введена буквально до ее конца, т.е. до '\n' (нажатие Enter)
Еще один - забить навсегда на эту жуткую функцию - scanf. Ибо она - не очень умный робот, изо всех сил пытающийся тебе угодить. Но не всегда твои ожидания и ожидания этой херни совпадают. Да, у нее есть некоторые зачатки ИИ. Она что-то предполагает, чего-то ждет... Но в силу зачаточности своего интеллекта может наделать много бед.
К сожалению, в Си нет нормальной функции, осуществляющей ввод. Рассчитывать приходится только на себя.
То есть в том случае, если ты собираешься еще что-то вводить, не полениться, и создать СВОЮ функцию ввода. Поведение которой ты сможешь полностью контролировать. Для новичка это не совсем тривиальная задача. Но поверь - дело стоит того.

Добавлено через 4 минуты
Цитата Сообщение от KarKarasik Посмотреть сообщение
спасибо, что помогли.
Если на этом твое путешествие подходит к концу, то и слава Богу.
Цитата Сообщение от KarKarasik Посмотреть сообщение
что это за магия
Посмотри доку про scanf, и внимательно прочитай. После этого тебе все детективы покажутся просто ерундой и детской забавой.
Удачи!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.12.2019, 21:01
Помогаю со студенческими работами здесь

Функция scanf запрашивает переменную два раза
main( ) { float rost, rezul; char beep; printf(&quot; fgdfgfg \n&quot;); printf(&quot;v futax ves vvedi \n&quot;); scanf(&quot;%f &quot;, &amp;rost); ...

Уменьшить в два раза отрицательные элементы массива
помогите найти ошибки. #include &lt;stdio.h&gt; #include &lt;conio.h&gt; int main() { int i,n; float a; printf (&quot;vvedite n \n&quot;); ...

Увеличить эту строку в два раза, продублировав ее.
Увеличить эту строку в два раза, продублировав ее. работая со строками как с массивами. Как дублировать, строка char Добавлено...

Программа просит вводить переменные по два раза
Рабочая программа -#include &quot;stdafx.h&quot; #include &lt;math.h&gt; #include &lt;iostream&gt; #include &lt;stdio.h&gt; void main () { float...

Fscanf: почему последнее число печатается два раза?
#include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; int main() { FILE*k; int n; int...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru