Форум программистов, компьютерный форум CyberForum.ru

Вывод переменных типа char: правильно выводится только первый символ - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Rookie Hose
4 / 4 / 2
Регистрация: 25.08.2014
Сообщений: 36
25.08.2014, 17:03     Вывод переменных типа char: правильно выводится только первый символ #1
Всем привет. Извиняюсь, если вопрос слишком уж нелепый, но не могу понять в чем суть...

C++
1
2
3
4
5
6
7
8
9
10
#include <cstdio>
 
int main()
{
    char a,b,c;
    printf("Enter smth: ");
    scanf("%c,%c,%c", &a, &b, &c);
    printf("%c,%c,%c", a, b, c);
    return 0;
}
Почему-то выводит printf нормально только первый символ, два других - совершенно другие символы...в том числе и в случае, когда для всех трех переменных вводишь одинаковые буквы...в чем тут загвоздка?
Скриншот для наглядности.
Миниатюры
Вывод переменных типа char: правильно выводится только первый символ  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2014, 17:03     Вывод переменных типа char: правильно выводится только первый символ
Посмотрите здесь:

сравение переменных типа char C++
C++ Суммирование 2-х переменных типа Char
Объясните как правильно сравнить переменные типа char C++
C++ Способы конкатенации переменных строкового типа и Char
C++ Вывод переменной типа char
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
КОП
348 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 755
25.08.2014, 17:15     Вывод переменных типа char: правильно выводится только первый символ #2
Замени запятые пробелами в scanf

Добавлено через 2 минуты
Или можно вводить символы через запятую, тож прокатит
Rookie Hose
4 / 4 / 2
Регистрация: 25.08.2014
Сообщений: 36
25.08.2014, 22:30  [ТС]     Вывод переменных типа char: правильно выводится только первый символ #3
Я извиняюсь, что ввел в заблуждение. Код выше я ввел на работе в перерыве в Code::Blocks, сам того не ожидая, что это работает (единственное, забыл про запятые при вводе). Дома я изучаю программирование с visual studio express и этот самый код (немного видоизмененный в мелочах) не работает так, как надо
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <cstdio>
#include <system_error>
 
int main()
{
    char a, b, c;
    printf("Enter smth: ");
    scanf_s("%c,%c,%c", &a, &b, &c);
    printf("%c,%c,%c", a, b, c);
    system("pause");
    return 0;
}
В чем может быть загвоздка? помогите чайнику
КОП
348 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 755
25.08.2014, 22:50     Вывод переменных типа char: правильно выводится только первый символ #4
Вводите символы так: а,б,в ? (scanf_s дает сбой, а если просто scanf, то работает в студии)
Либо пробелы добавьте
C++
1
scanf("%c %c %c", &a, &b, &c);
Rookie Hose
4 / 4 / 2
Регистрация: 25.08.2014
Сообщений: 36
25.08.2014, 22:57  [ТС]     Вывод переменных типа char: правильно выводится только первый символ #5
scanf дает ошибку:
"Error 1 error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. g:\vs_projects\consoleapplication7\consoleapplication7\consoleapplication7.cpp 8 1 ConsoleApplication7"

Добавлено через 3 минуты
Собственно, добавление
C++
1
#define _CRT_SECURE_NO_WARNINGS
решило проблему.
Однако, непонятным осталось scanf_s - почему именно из-за этого ошибка?
КОП
348 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 755
25.08.2014, 23:24     Вывод переменных типа char: правильно выводится только первый символ #6
Цитата Сообщение от Rookie Hose Посмотреть сообщение
Однако, непонятным осталось scanf_s - почему именно из-за этого ошибка?
определяем char d;
пишем
C++
1
scanf_s("%c %c %c", &a, &d, &b, &d, &c, &d);
Попробуйте, видимо связано с наличием '\0' в конце строк, и его некуда считывать.

Добавлено через 2 минуты
ps: вот поэтому я ненавижу форматированный ввод, уж очень мутный. Хотя если привыкнуть, будет в разы удобнее с ним.
Rookie Hose
4 / 4 / 2
Регистрация: 25.08.2014
Сообщений: 36
25.08.2014, 23:35  [ТС]     Вывод переменных типа char: правильно выводится только первый символ #7
Спасибо, помогло! Однако, не совсем разобрался, почему именно только так и работает scanf_s. Ну да ладно, со временем, думаю, придет понимание

<iostream> для меня намного удобнее ( именно с нее начал обучаться), но сейчас купил книгу, тут везде printf. scan f. Пока что очень не привычно, но свои плюсы тоже есть - насколько я понял, это более гибкие параметры форматирования "%X" и т.д. Сорри за оффтоп.
КОП
25.08.2014, 23:37
  #8

Не по теме:

Цитата Сообщение от Rookie Hose Посмотреть сообщение
Однако, не совсем разобрался, почему именно только так и работает scanf_s
Да черт его знает, я методом тыка все делал)) Но понимание приходит, хоть и медленно

Rookie Hose
4 / 4 / 2
Регистрация: 25.08.2014
Сообщений: 36
27.08.2014, 02:31  [ТС]     Вывод переменных типа char: правильно выводится только первый символ #9
Ребята, объясните, пожалуйста, почему 2%3 = 2 (20/3= 20-(6*3)= 2 ?), a 1/5 = 1 ? (по этой же логике, 10/5 = 0)?
Или же тут берется так:
2 % 3 = 2 - ((int) 2/3 * 3)?

почему остаток не должен быть равен 0 при a/b если b>a ?
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
27.08.2014, 02:42     Вывод переменных типа char: правильно выводится только первый символ #10
Цитата Сообщение от Rookie Hose Посмотреть сообщение
почему 2%3 = 2
А как еще?
13 яблока раздали на троих. По 4 яблока и 1 оставили, чтобы не посориться.
2 яблока раздали на троих. Чтобы не посорится оставили 2 яблока.

Цитата Сообщение от Rookie Hose Посмотреть сообщение
1/5 = 1
C++
1
2
3
4
int x = 1/5;
cout << x; // 0
float x = 1/5;
cout << x; // 0.2
Rookie Hose
4 / 4 / 2
Регистрация: 25.08.2014
Сообщений: 36
27.08.2014, 13:29  [ТС]     Вывод переменных типа char: правильно выводится только первый символ #11
под 1/5 опечатка - конечно, имел ввиду 1 % 5

Вообщем, вчера после отправки предыдущего сообщения, наконец-то устаканилось все в голове.
при вводе 2 % 3 мы определяем целый остаток от числа 2, т.е. именно 2 % 3 = 2 - ((int) 2/3 * 3) и т.д. Например, 7 % 9 = 7; 99 % 100 = 99 и т.д.

По началу в голове смешивались с % как простое деление, так и дробная часть от деления.

Блин, извиняюсь, конечно, за такие очевидно-бредовые вопросы Спасибо всем за помощь.
Rookie Hose
4 / 4 / 2
Регистрация: 25.08.2014
Сообщений: 36
31.08.2014, 00:16  [ТС]     Вывод переменных типа char: правильно выводится только первый символ #12
Подведу итог, после чего тему можно прикрывать

код типа
C++
1
scanf_s ("%c", &a)
в VS 2013 не работает (как минимум на win 7)! чтобы заработало, есть два пути:

1) Прописать до
C++
1
#include
строчку
C++
1
#define _CRT_SECURE_NO_WARNINGS
, после чего можно писать просто
C++
1
scanf ("%c", &a)
- работать будет.

2) Просто вписать любое, отличное от нуля число после определения адреса, например:
C++
1
scanf_s ("%c", &a, 1)
C++
1
scanf_s ("%c", &a, 23232.2323232)
C++
1
scanf_s ("%c", &a, -1)
и т.д.

Надеюсь, для кого-нибудь еще окажется полезным
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
31.08.2014, 00:21     Вывод переменных типа char: правильно выводится только первый символ #13
Цитата Сообщение от Rookie Hose Посмотреть сообщение
"Error 1 error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. g:\vs_projects\consoleapplication7\consoleapplication7\consoleapplication7.cpp 8 1 ConsoleApplication7"
В студии это варнинг обычно (не ошибка, а предпреждение). Но в настройках проекта может стоять такая фича как "Трактовать warning как error". Нужно проверить Alt+F7 ---> Configuration ---> C/C++ --> Обрабатывать предпреждения как ошибки. Чтобы они так не обрабатывались, должен стоять ключ /WX
Rookie Hose
4 / 4 / 2
Регистрация: 25.08.2014
Сообщений: 36
03.09.2014, 00:35  [ТС]     Вывод переменных типа char: правильно выводится только первый символ #14
Просьба к модераторам - можно переименовать тему в "Наивные вопросы новичка"? Мне не хочется создавать кучу тем с простейшими (для более опытных пользователей) вопросами...
очередной:

в книге есть задача вычислить y через x в диапазонах:
x < -5;
-5 =< x =< 5;
x > 5;

Причем, задача стоит вычислить двумя способами - через if и case.
Проблем с if нет никаких, но вот с switch - case непонятно, что имелось ввиду...Насколько я понял, switch - case удобно применять, когда есть жестко заданные условия, как решить задачу, когда есть условия x < -5 и x > 5 ?

Неправильно сформулированная задача в книге, или что-то упустил из виду? Можно еще решить совместно - от -5 до 5 через switch - case, а остальное через if. Но в примере написано именно "двумя способами"
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
03.09.2014, 00:57     Вывод переменных типа char: правильно выводится только первый символ #15
Вроде бы работает
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
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <cmath>
 
 
int main()
{
    int x;
    std::cin >> x;
    switch(x)
    {
        case 0:
            std::cout << "-5 <= x <= 5";
            break;
        default:
            {
                switch(x / abs(x))
                {
                    case -1:
                        {
                            switch(x / -6)
                            {
                                case 0:
                                    std::cout << "-5 <= x <= 5";
                                    break;
                                default:
                                    std::cout << "< -5";
                                    break;
                            }
                            break;
                        }
                    default:
                        {
                            switch(x / 6)
                            {
                                case 0:
                                    std::cout << "-5 <= x <= 5";
                                    break;
                                default:
                                    std::cout << "> 5";
                                    break;
                            }
                            break;
                        }
                }
                break;
            }
    }
    std::cout << std::endl;
    return 0;
}
КОП
348 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 755
03.09.2014, 00:58     Вывод переменных типа char: правильно выводится только первый символ #16
Rookie Hose, действительно странно, такое вроде как через if спокойно решается. Как вариант, разделить числовую прямую на три условные зоны. получить номер зоны и его уже закинуть в switch. Хотя я тоже новичок в
этом деле, могу чушь спороть иногда.
что-то типа:
C++
1
switch (x < -5 ? 0 : x =< 5 ? 1 : 2)
писал сразу тут, могут быть синтаксические неточности.
Rookie Hose
4 / 4 / 2
Регистрация: 25.08.2014
Сообщений: 36
03.09.2014, 13:35  [ТС]     Вывод переменных типа char: правильно выводится только первый символ #17
Спасибо за идеи, вот воплащение :

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
42
43
44
45
#include <cstdio>
#include <cstdlib>
 
int main()
{
    double x, x2, y;
    int m, tmp1;
 
    printf("1. X input\n2. Y input\nPick 1 or 2\n");
    scanf("%d", &m);
    switch (m)
    {
        case 1:
                printf("Enter X: ");
                scanf("%lf", &x);
 
                x < -5 ? tmp1 = 1 : (x < 5 ? tmp1 = 2 : tmp1 = 3);
                switch (tmp1)
                    {
                        case 1: y = x; break;
                        case 2: y = x * x; break;
                        case 3: y =  0; break;
                        default: printf("Invalid input\n");
                    }
                printf("Y: %.3lf\n", y);
                break;
        case 2:
                printf("Enter X2: ");
                scanf("%lf", &x2);
 
                x2 < -5 ? tmp1 = 1 : (x2 < 5 ? tmp1 = 2 : tmp1 = 3);
                switch (tmp1)
                    {
                        case 1: y = x2; break;
                        case 2: y = x2 * x2 * x2; break;
                        case 3: y = -5; break;
                        default: printf("Invalid input\n");
                    }
                printf("Y: %.3lf\n", y);
                break;
        default: printf("Invalid input\n");
    }
    system("pause");
    return 0;
}
Читабелен ли такой код?
gru74ik
Модератор
 Аватар для gru74ik
3122 / 1348 / 167
Регистрация: 20.02.2013
Сообщений: 3,866
Записей в блоге: 18
03.09.2014, 13:47     Вывод переменных типа char: правильно выводится только первый символ #18
Цитата Сообщение от Rookie Hose Посмотреть сообщение
Просьба к модераторам - можно переименовать тему в "Наивные вопросы новичка"? Мне не хочется создавать кучу тем с простейшими (для более опытных пользователей) вопросами...
Это вряд ли. Потому как будет против правил форума (пункт 4.4):
На каждый вопрос создавайте по одной теме - это помогает избежать путаницы в ответах и облегчает поиск.
КОП
348 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 755
03.09.2014, 13:49     Вывод переменных типа char: правильно выводится только первый символ #19
Цитата Сообщение от Rookie Hose Посмотреть сообщение
x < -5 ? tmp1 = 1 : (x < 5 ? tmp1 = 2 : tmp1 = 3);
зачем же столько присваиваний?
C++
1
tmp1 = x2 < -5 ? 1 : (x2 < 5 ? 2 : 3);
а еще проще без tmp1
C++
1
2
switch(x2 < -5 ? 1 : (x2 < 5 ? 2 : 3))
...
и на с++ привычнее все таки cout вместо printf, в остальном читабельность отличная.

PS: некоторым может не нравиться тренарный оператор ? : , т.к. иногда его становится сложно читать (а некоторым просто не нравится), но тут,как мне кажется, он уместен.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2014, 14:05     Вывод переменных типа char: правильно выводится только первый символ
Еще ссылки по теме:

Вывод списка объектов. Выводится только ссылка на первый элемент C++
Выводится в файл только первый символ строки, остальные пустые C++
Выводится только первый символ строки C++

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

Или воспользуйтесь поиском по форуму:
Rookie Hose
4 / 4 / 2
Регистрация: 25.08.2014
Сообщений: 36
03.09.2014, 14:05  [ТС]     Вывод переменных типа char: правильно выводится только первый символ #20
КОП, насчет присваивания - да, согласен, учту на будущее. Так я написал, потосу что на первый взгляд показалось, что так проще понять.

а насчет tmp1 - с ней же читабельность и простота повышаются?
C++
1
switch(x2 < -5 ? 1 : (x2 < 5 ? 2 : 3))
на первый взгляд кажется тяжелой конструкцией.

Но это, наверное, на неопытный взгляд только...К тому же, с доп. переменными, выходит, больше вычисленный...Тоже буду стараться так писать. Спасибо
Yandex
Объявления
03.09.2014, 14:05     Вывод переменных типа char: правильно выводится только первый символ
Ответ Создать тему
Опции темы

Текущее время: 06:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru