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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Rookie Hose
4 / 4 / 2
Регистрация: 25.08.2014
Сообщений: 36
#1

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

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

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

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 нормально только первый символ, два других - совершенно другие символы...в том числе и в случае, когда для всех трех переменных вводишь одинаковые буквы...в чем тут загвоздка?
Скриншот для наглядности.
0
Миниатюры
Вывод переменных типа char: правильно выводится только первый символ  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2014, 17:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вывод переменных типа char: правильно выводится только первый символ (C++):

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

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

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

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

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

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

22
КОП
361 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 762
25.08.2014, 17:15 #2
Замени запятые пробелами в scanf

Добавлено через 2 минуты
Или можно вводить символы через запятую, тож прокатит
1
Rookie Hose
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
КОП
361 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 762
25.08.2014, 22:50 #4
Вводите символы так: а,б,в ? (scanf_s дает сбой, а если просто scanf, то работает в студии)
Либо пробелы добавьте
C++
1
scanf("%c %c %c", &a, &b, &c);
1
Rookie Hose
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
КОП
361 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 762
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
Rookie Hose
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
Rookie Hose
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
rikimaru2013
C++ Game Dev
2438 / 1132 / 240
Регистрация: 30.11.2013
Сообщений: 3,688
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
Rookie Hose
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
Rookie Hose
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
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
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
Rookie Hose
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
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
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
03.09.2014, 00:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2014, 00:57
Привет! Вот еще темы с ответами:

Как преобразовать первый символ строки в переменную char? - C++
string str = &quot;hello&quot;; char ch; хочу чтобы в переменной &quot;ch&quot; лежал символ &quot;h&quot; Это в идеале, если возможно без дополнительных...

Суммирование 2-х переменных типа Char - C++
Снова такая проблема.... есть 2 переменные char x='1'; char y='2'; мне нужно получить переменную типа int z=12

сравение переменных типа char - C++
Доброго времени суток, у меня возникла проблема... Нужно ввести название товара, и что бы на экран вывелась информация об этом товаре ...

Перевод переменных типа int в char - C++
как перевести отрицательную цифру интежер в чар?


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru