Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.52/29: Рейтинг темы: голосов - 29, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 27.01.2016
Сообщений: 6

Цикл выполняется через раз игнорируя считывание с клавиатуры

28.01.2016, 00:14. Показов 6647. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Изучая оператор switch решил запихнуть его в цикл. Программа должна считывать символ, введенный с клавиатуры и вывести на экран слово, которое начинается на введенную букву.
Кликните здесь для просмотра всего текста
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>
#include<conio.h>
 
int main()
{
    char A;
    int e;
    printf ("Введите первую букву предмета:\n");
    while(e!=1) 
{
    scanf ("%c", &A);
    switch (A)
    {
        case 'т': printf("Телефон.\n"); break;
        case 'к': printf("Компьютер.\n"); break;
        case 'ш': printf("Шкаф.\n"); break;
        case 'с': printf("Стул.\n"); break;
        case 'ц': printf("Цветок.\n"); break;
        case 'c': printf("computer.\n"); break;
        case 'e': e = 1; break;
        default: printf("Таких не знаю.\n");
    }   
}
    return 0;
}


Все вроде бы нормально, кроме одного: после выполнения каждого из условий в case она выполняет условие в default. Я сначала думал, что он просто переходит на дефолт почему-то(но брейки-то везде стоят!), и для того, что бы посмотреть, КОГДА ИМЕННО это происходит, я решил сделать вот так:

Кликните здесь для просмотра всего текста
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
#include<stdio.h>
#include<conio.h>
 
int main()
{
    char A;
    int e;
    printf ("Введите первую букву предмета:\n");
    while(e!=1) 
{
        printf("1\n");
    scanf ("%c", &A);
        printf("2\n");
    switch (A)
    {
        case 'т': printf("Телефон.\n"); break;
        case 'к': printf("Компьютер.\n"); break;
        case 'ш': printf("Шкаф.\n"); break;
        case 'с': printf("Стул.\n"); break;
        case 'ц': printf("Цветок.\n"); break;
        case 'c': printf("computer.\n"); break;
        case 'e': e = 1; break;
        default: printf("Таких не знаю.\n");
    }   
        printf("3\n");
}
    return 0;
}

Собственно, вот как это выглядело:



На скрине видно, что программа выполняет тело цикла, пропуская
C
1
scanf ("%c", &A);
а затем выполняет его, ожидая введения с клавиатуры символа(я ввел "т" один раз, больше ничего не вводил, дальше было вновь ожидание введения).

Почему так происходит? Почему цикл while через раз пропускает функцию scanf?

У меня из-за подобного руки опускаются и пропадает желание изучать программирование дальше. Пожалуйста, помогите разобраться.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.01.2016, 00:14
Ответы с готовыми решениями:

Цикл выполняется 1 раз
&lt;?php require (&quot;seting.php&quot;); mysql_query(&quot;SET NAMES utf8&quot;); $link = mysql_connect(&quot;$host&quot;, &quot;$log&quot;, &quot;$pass&quot;) or die(&quot;Проблеммы с...

Цикл выполняется только раз
задача 75: &gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; int main() { int x,y,z,p,k; printf(&quot;x = &quot;); &gt; scanf(&quot;%d&quot;,&amp;x); ...

Цикл выполняется один раз
Здравствуйте! Помогите, пожалуйста с задачей. Пусть а=а=1. а = а + а/2к-1 где к=2,3...Посчитать произведение а0*а1*…*а пока...

25
738 / 543 / 416
Регистрация: 17.09.2015
Сообщений: 1,601
01.02.2016, 20:13
Студворк — интернет-сервис помощи студентам
easybudda, я вопрос задавал
Цитата Сообщение от LFC Посмотреть сообщение
Я правильно понимаю,что когда в scanf используется %s,то из буфера туда помещается всё, и при следующем вызове scanf работает корректно?
в контексте,применительно к коду ТС,в том смысле что \n и \r не зависают где-то в буфере,а присваиваются переменной, и из-за них не происходит сбой при следующем шаге цикла.
Цитата Сообщение от easybudda Посмотреть сообщение
Ведущие пробельные символы
это какие?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,980
01.02.2016, 22:08
LFC, вот к примеру:
C
1
2
3
char a[256], b[256];
char c;
scanf("%255s%255s", a, b);
прочитает с консоли 2 слова (не длиннее 255 символов каждое), при этом первое окажется в a, второе в b, а не оба в а, да ещё и с символом перевода строки, как можно было бы подумать исходя из вашей логики. При этом всё равно, введены слова через один пробел, через три, или по одному в строке. Мало того, все пробелы, знаки табуляции или переводы строки между словами будут пропущены (для второго слова это и есть ведущие пробелы). Куда при этом денется перевод строки после второго слова? Да так в потоке и останется:
C
1
2
3
scanf("%c", &c);
if ( c == '\n' )
    printf("woodoo magic!");
Собственно с этим у ТС проблема и была - символ перевода строки в потоке ввода оставался.
2
260 / 87 / 30
Регистрация: 29.10.2015
Сообщений: 196
02.02.2016, 00:20
Цитата Сообщение от easybudda Посмотреть сообщение
не длиннее 255 символов каждое
Спасибо за инфу, не знал про такую особенность.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,980
02.02.2016, 01:04
Цитата Сообщение от Dreamer_0x01 Посмотреть сообщение
не знал про такую особенность
Функции семейства printf/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
#include <stdio.h>
#include <string.h>
#include <ctype.h>
 
int main(void) {
    char msg[] = "Just write your wishings to [email]santaclaus@gmail.com[/email] and you'll get it!";
    char name[sizeof(msg)], host[sizeof(msg)], domain[5];
    int found = 0;
    
    while ( ! ( found = ( sscanf(msg, "%[^@ \t\n]@%[^. \t\n].%4s", name, host, domain) == 3 ) ) ) {
        while ( *msg && ! isspace(*msg) )
            memmove(msg, msg + 1, strlen(msg));
        if ( ! *msg )
            break;
        while ( *msg && isspace(*msg) )
            memmove(msg, msg + 1, strlen(msg));
        if ( ! *msg )
            break;
    }
    
    if ( found )
        printf("Santa email: %s@%s.%s\n", name, host, domain);
    else
        printf("No Santa email found.\n");
    
    return 0;
}
Code
1
2
3
4
~/cpp/strings $ gcc santamail.c 
~/cpp/strings $ ./a.out 
Santa email: santaclaus@gmail.com
~/cpp/strings $
Теги [email] в строку форумом сами добавляются
http://codepad.org/Uk3TsXUl
1
260 / 87 / 30
Регистрация: 29.10.2015
Сообщений: 196
02.02.2016, 02:15
Цитата Сообщение от easybudda Посмотреть сообщение
При определённой сноровке можно чуть ли не регулярные выражения писать
Так они и получились по сути.
На самом деле, действительно круто. 15й год уже программированием зарабатываю, не знал про такую особенность .
(Правда, у меня 90% заказов - для железа и микроконтроллеров, там несколько иная специфика).
0
738 / 543 / 416
Регистрация: 17.09.2015
Сообщений: 1,601
02.03.2016, 08:19
Какое простое и изящное решение нашей проблемы:Реализация ожидания ввода предложил TheCalligrapher
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.03.2016, 08:19

Определить, сколько раз выполняется цикл
Помогите,пожалуйста,решить задачу)

Цикл выполняется только один раз
var a, b, s :integer; begin read (a); s:=0; repeat begin if (a mod 10 mod 2)&lt;&gt;0 then s:=s + a mod 10; a:=a div 10; end; ...

Цикл for выполняется 1 раз вместо двух!!!
непонятно, добавил нужное условие, но цикл выполняется ТОЛЬКО 1 раз, хотя по условию должен выполняться 2 раза $c =...

Цикл выполняется только один раз.
#include &quot;stdafx.h&quot; #include &quot;iostream&quot; using namespace std; struct kvartira { int kolichestvo; int etazh; float...

Цикл выполняется лишь один раз
Вот мой код, который за никнеймом пользователя должен создавать по простому циклу ему пароль - 1 символ пароля = 1 символ ника, 2 символ -...


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru