Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 37
1

Программа аварийно завершается после оператора scanf

27.06.2017, 11:24. Показов 2115. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Такая проблема.
Я начинающий. Занимаюсь уже вторую неделю. Написал такой код, запускаю программа. Все хорошо, но стоит дойти программе до операции ввода 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
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <cstdlib>
#include <stdio.h>
 
 
using namespace std;
int main(){
    setlocale (LC_ALL, "");
    system ("color 0a");
 
    // ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННЫХ;
    char approve;
    char log;
    char pass;
    int count; //счетчик кол-ва попыток входа;
 
 
    cout << "+---------------------------------------------+" << endl;
    cout << "|    ПРОГРАММА ВВОДА ДАННЫХ ОБ КОМПЬЮТЕРАХ    |" << endl;
    cout << "+---------------------------------------------+" << endl;
    cout << endl;
    cout << ">> LARSSON Ltd.,";
    cout << "Пожалуйста авторизуйтесь в системе!";
    cout << endl;
    log = '1';
    cout << "Вы согласны? (yes/no): ";
    scanf ("%s", approve);
    if (approve = 'yes') {goto yes;}
    if (approve = 'no')  {goto no;}
 
    return 0;
 
    yes: {
        cout <<" Вы выбрали " << approve << endl << log << endl;
        }
    no: {
        cout << "Вы отказались " << approve << endl;
        return 0;}
}
Причем, завершается, как только нажимаешь Enter после ввода слова. Например, no.
До этого стоял оператор CIN >>. Но он не принимал строку, а только присваивал approve одну букву "s". Причем неважно, ввел ты no или yes. При этом почему то выполнялись обе функции и yes: и no:.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.06.2017, 11:24
Ответы с готовыми решениями:

Программа аварийно завершается
Доброго времени суток! Моя программа аварийно завершается вернув значение &quot;255 (0xFF)&quot; Прошу...

программа завершается аварийно
запускаю компилятор, все запустилось, работает (меню из кучи условий if-else). выбираю любой пункт...

Рекурсия, почему программа завершается аварийно?
Подскажите, почему не работает рекурсия?? #include &lt;iostream&gt; using namespace std; void fn(int...

Программа на других компьютерах завершается аварийно
Здравствуйте, у меня дикая проблема: я написал программу (кинуть код не могу, он очень большой,...

18
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
27.06.2017, 11:30 2
%s подразумевает строку, а не один символ.
0
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 37
27.06.2017, 11:34  [ТС] 3
я вводу либо "yes" либо "no". Могу ввести просто "y" или "n". Чтобы я не ввел, программа завершается.
Миниатюры
Программа аварийно завершается после оператора scanf  
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
27.06.2017, 11:38 4
Ну если просто буква, то тогда и спецификатор используй для буквы - %c, а для получения результата должен быть передан указатель на приёмник, а не значение как у тебя.
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
27.06.2017, 12:02 5
Цитата Сообщение от alexey15 Посмотреть сообщение
'yes'
в одинарных кавычках указывается один символ.
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
27.06.2017, 12:13 6
Цитата Сообщение от alexey15 Посмотреть сообщение
scanf ("%s", approve);
Попытка записать в символ строку. Добро пожаловать в мир Си. Поэтому в С++ придумали операторы std::cin и std::cout. Используйте их.
Цитата Сообщение от alexey15 Посмотреть сообщение
approve = 'yes'
присваивание (сравнение делается через ==) в char multi-character constant.
Для строк используйте std::string.
1
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 37
27.06.2017, 12:32  [ТС] 7
Проблема решилась. Я измениk на cout. Теперь работает. Но работает если ввести один символ, или Y или N. Как сделать так, чтобы approve принимал целое слово и условие IF (approve=='yes') выполнялось?

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
#include <cstdlib>
#include <stdio.h>
 
 
using namespace std;
int main(){
    setlocale (LC_ALL, "");
    system ("color 0a");
 
    // ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННЫХ;
    char approve;
    char log;
    char pass;
    int count; //счетчик кол-ва попыток входа;
 
 
    cout << "+---------------------------------------------+" << endl;
    cout << "|    ПРОГРАММА ВВОДА ДАННЫХ ОБ КОМПЬЮТЕРАХ    |" << endl;
    cout << "+---------------------------------------------+" << endl;
    cout << endl;
    cout << ">> LARSSON Ltd.,";
    cout << "Пожалуйста авторизуйтесь в системе!";
    cout << endl;
    log = '1';
    cout << "Вы согласны? (yes/no): ";
    std::cin >> approve;
    if (approve == 'y') {goto yes;}
    if (approve == 'n')  {goto no;}
 
    return 0;
 
    yes: {
        cout <<" Вы выбрали " << approve << endl << log << endl;
        return 0;
        }
    no: {
        cout << "Вы отказались " << approve << endl;
        return 0;}
}
Добавлено через 2 минуты
Кстати. Я так и не понял почему оператор
C++
1
scanf ("%s", approve);
не работает? Ведь я указал тип char.

П.С.
Да этого я работал в basic. И там такой жесткости не было. Там вообще было пофиг, что будет содержать строковая переменная и какой она будет длины. Поэтому здесь у меня небольшой слом мозга.
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
27.06.2017, 12:34 8
Цитата Сообщение от alexey15 Посмотреть сообщение
не работает
плейсхолдер s означает, что там будет строка, а строка это всё, что 1 или более символов.
и ещё передавать в scanf надо по указателю, иначе переменная не изменится.
0
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 37
27.06.2017, 12:36  [ТС] 9
что такое указатель? И как он влияет на переменную?
0
Эксперт .NET
5871 / 4748 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361
27.06.2017, 12:39 10
C++
1
2
3
4
5
6
7
8
9
10
#include <string>
//...
std::string approve;
//...
std::cin >> approve;
if (approve == "yes")
    std::cout <<" Вы выбрали " << approve << std::endl << log << std::endl;
if (approve == "no")
    std::cout << "Вы отказались " << approve << std::endl;
return 0;
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
27.06.2017, 12:41 11
Цитата Сообщение от alexey15 Посмотреть сообщение
что такое указатель?
переменная, хранящая адрес другой переменной, либо nullptr, либо мусор.
Цитата Сообщение от alexey15 Посмотреть сообщение
И как он влияет на переменную?
если ты передаешь просто так, то как scanf узнает, какую переменную надо менять?
если передаешь по указателю, то она использует хранящийся в указателе адрес для того, чтобы записать по этому адресу введенное тобою значение.

в scanf можно передавать переменные с помощью оператора взятия адреса, в твоем случае: scanf("%c", &approve);.
0
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 37
27.06.2017, 12:49  [ТС] 12
Я так полагаю это вопрос организации памяти.
Но как выглядит этот указатель? Я правильно понимаю, что в таком случае он должен быть отдельным для каждой переменной? И почему имя переменной не может само по себе быть указателем? Оно же уникально, как ДНК человека.
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
27.06.2017, 12:56 13
Цитата Сообщение от alexey15 Посмотреть сообщение
не работает? Ведь я указал тип char.
1) Потому что когда scanf придумывали, ссылок и шаблонов еще не было. Поэтому, в cin совать char можно, а в scanf можно только указатель. И вообще, scanf/printf предоставляют огромный простор для того чтобы съесть кирпич под видом чебурека, а потом долго удивляться откуда проблемы с зубами.
2) scanf читает строки в си-стиле. При этом в конец строки всегда добавляется дополнительный "нулевой" символ, который этот самый конец строки и отмечает. Один символ для хранения "y", да еще один символ на признак конца строки - в один char никак не влезет.
0
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 37
27.06.2017, 12:56  [ТС] 14
Это выдержка из учебника по Бэйсику. Вы про этого говорили?
Последним необязательным символом имени переменной может быть один из знаков объявления типа переменной (%, !, #, $):
знак % определяет перемешгую целого типа
знак ! — переменная с обычной точностью
знак # — переменная с двойной точностью
знак $ — строковая переменная.
Имена, отличающиеся друг от друга лишь последним знаком, воспринимаются как различные переменные. Например, N%, N!, N#, N$ — имена различных переменных.
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
27.06.2017, 12:58 15
Цитата Сообщение от alexey15 Посмотреть сообщение
И почему имя переменной не может само по себе быть указателем?
Может. Называется "ссылка". Но это в C++, а scanf - темное наследие Си.
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
27.06.2017, 12:59 16
брось ты уже свой бейсик, это не бейсик, а с++, тут много чего по-другому и не стоит опираться на опыт работы с бейсиком.
0
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 37
27.06.2017, 13:05  [ТС] 17
Объясните мне, в каких случаях значение переменной должно равнять одному символу? Ведь бывают же случаи, когда мы не знаем, какое значение примет переменная. Это может быть один символ/цифра, много символов. Не проще ли сразу указывать все строковые переменные типа string? Зачем нужен char?
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
27.06.2017, 13:15 18
Цитата Сообщение от alexey15 Посмотреть сообщение
Объясните мне, в каких случаях значение переменной должно равнять одному символу?
Например, когда нужно проверить что этот один символ является буквой.
Цитата Сообщение от alexey15 Посмотреть сообщение
Не проще ли сразу указывать все строковые переменные типа string?
Проще, но дороже. Стринг резиновый, для резиновости дергает динамическую память, а выделение динамической памяти - процесс не самый быстрый. Тогда как под какой ни будь сишный char str[128] память выделяется практически мгновенно.
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
27.06.2017, 13:21 19
Цитата Сообщение от Renji Посмотреть сообщение
Стринг резиновый, для резиновости дергает динамическую память, а выделение динамической памяти - процесс не самый быстрый.
Вообще-то есть SSO и для малых строк будет тот же char массив.
0
27.06.2017, 13:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.06.2017, 13:21
Помогаю со студенческими работами здесь

При вводе данных в объект программа аварийно завершается
Здравствуйте. В процессе выполения лаб.работы столкнулась с такой проблемой. Вот мое задание:...

Проблемы с delete [], программа периодически аварийно завершается на строке с освобождением памяти.
Добрый день! Столкнулся со следующей задачей: в программе требуется довольно часто изменять...

Программа аварийно завершается с ошибкой "map/set iterators are incompatible"
Добрый день! Проблема такая: в s1 и s2 рандомно добавляю числа, хочу найти объединение этих...

Программа завершается аварийно при вызове функции
Делаю консольное приложение на шестом Билдере. Не могу найти ошибку.Убил день. Прога компилиться...

Программа аварийно завершается при прохождении цикла
QVector&lt;int&gt; Set; QPair &lt;int,int&gt; Map; int c=0,Num,; srand(time(NULL)); ...

Работа с матрицами (программа завершается аварийно)
Помогите, на Си, не С++. Выдает другие значения, к тому же аварийно завершает программу Для...


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

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