Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/55: Рейтинг темы: голосов - 55, средняя оценка - 4.64
4 / 4 / 2
Регистрация: 25.08.2014
Сообщений: 36
1

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

25.08.2014, 17:03. Показов 10471. Ответов 22
Метки нет (Все метки)

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

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: правильно выводится только первый символ  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.08.2014, 17:03
Ответы с готовыми решениями:

Выводится только первый символ строки
Имеется код: #include &lt;iostream&gt; using namespace std; int main() { string k, s =...

При сложении переменных типа char выводится код символа
Почему когда говоришь вывести символ &quot;а&quot; выводится &quot;А&quot; а когда просишь вывести &quot;а+b&quot; выводит...

После INSERT в datagridview выводится только первый символ
Добрый день! Помогите, пожалуйста, найти ошибку. Есть главная форма и есть форма для добавления...

Считывается только первый символ char
Всем привет! При введении данных с клавиатуры записывается только первый символ, а дальше программа...

22
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
25.08.2014, 17:15 2
Замени запятые пробелами в scanf

Добавлено через 2 минуты
Или можно вводить символы через запятую, тож прокатит
1
4 / 4 / 2
Регистрация: 25.08.2014
Сообщений: 36
25.08.2014, 22:30  [ТС] 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;
}
В чем может быть загвоздка? помогите чайнику
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
25.08.2014, 22:50 4
Вводите символы так: а,б,в ? (scanf_s дает сбой, а если просто scanf, то работает в студии)
Либо пробелы добавьте
C++
1
scanf("%c %c %c", &a, &b, &c);
1
4 / 4 / 2
Регистрация: 25.08.2014
Сообщений: 36
25.08.2014, 22:57  [ТС] 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 - почему именно из-за этого ошибка?
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
25.08.2014, 23:24 6
Цитата Сообщение от Rookie Hose Посмотреть сообщение
Однако, непонятным осталось scanf_s - почему именно из-за этого ошибка?
определяем char d;
пишем
C++
1
scanf_s("%c %c %c", &a, &d, &b, &d, &c, &d);
Попробуйте, видимо связано с наличием '\0' в конце строк, и его некуда считывать.

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

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

Не по теме:

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

0
4 / 4 / 2
Регистрация: 25.08.2014
Сообщений: 36
27.08.2014, 02:31  [ТС] 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 ?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
27.08.2014, 02:42 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
2
4 / 4 / 2
Регистрация: 25.08.2014
Сообщений: 36
27.08.2014, 13:29  [ТС] 11
под 1/5 опечатка - конечно, имел ввиду 1 % 5

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

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

Блин, извиняюсь, конечно, за такие очевидно-бредовые вопросы Спасибо всем за помощь.
0
4 / 4 / 2
Регистрация: 25.08.2014
Сообщений: 36
31.08.2014, 00:16  [ТС] 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)
и т.д.

Надеюсь, для кого-нибудь еще окажется полезным
0
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
31.08.2014, 00:21 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
1
4 / 4 / 2
Регистрация: 25.08.2014
Сообщений: 36
03.09.2014, 00:35  [ТС] 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. Но в примере написано именно "двумя способами"
0
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
03.09.2014, 00:57 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;
}
1
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
03.09.2014, 00:58 16
Rookie Hose, действительно странно, такое вроде как через if спокойно решается. Как вариант, разделить числовую прямую на три условные зоны. получить номер зоны и его уже закинуть в switch. Хотя я тоже новичок в
этом деле, могу чушь спороть иногда.
что-то типа:
C++
1
switch (x < -5 ? 0 : x =< 5 ? 1 : 2)
писал сразу тут, могут быть синтаксические неточности.
1
4 / 4 / 2
Регистрация: 25.08.2014
Сообщений: 36
03.09.2014, 13:35  [ТС] 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;
}
Читабелен ли такой код?
0
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
03.09.2014, 13:47 18
Цитата Сообщение от Rookie Hose Посмотреть сообщение
Просьба к модераторам - можно переименовать тему в "Наивные вопросы новичка"? Мне не хочется создавать кучу тем с простейшими (для более опытных пользователей) вопросами...
Это вряд ли. Потому как будет против правил форума (пункт 4.4):
На каждый вопрос создавайте по одной теме - это помогает избежать путаницы в ответах и облегчает поиск.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
03.09.2014, 13:49 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: некоторым может не нравиться тренарный оператор ? : , т.к. иногда его становится сложно читать (а некоторым просто не нравится), но тут,как мне кажется, он уместен.
1
4 / 4 / 2
Регистрация: 25.08.2014
Сообщений: 36
03.09.2014, 14:05  [ТС] 20
КОП, насчет присваивания - да, согласен, учту на будущее. Так я написал, потосу что на первый взгляд показалось, что так проще понять.

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

Но это, наверное, на неопытный взгляд только...К тому же, с доп. переменными, выходит, больше вычисленный...Тоже буду стараться так писать. Спасибо
0
03.09.2014, 14:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.09.2014, 14:05
Помогаю со студенческими работами здесь

Выводится в файл только первый символ строки, остальные пустые
Есть код обработчика нажатия.По идее,ставя точки останова и проверяя значения все значения...

Правильно выводится только первый элемент полученного массива
char *IntToChar(long long chislo) { long long INT; int count=0; char str;...

Создание и вывод односвязного списка (выводится только первый элемент)
Надо создать список и вывести его, выводит только 1 и последний элемент, не понимаю почему,...

Вывод списка объектов. Выводится только ссылка на первый элемент
Ребят, помогите вывести список из объектов класа &quot;cic&quot;. Пробовал через итераторы как в мейне, но...


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

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