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

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

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

Студворк — интернет-сервис помощи студентам
Такая проблема.
Я начинающий. Занимаюсь уже вторую неделю. Написал такой код, запускаю программа. Все хорошо, но стоит дойти программе до операции ввода 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.06.2017, 11:24
Ответы с готовыми решениями:

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

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

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

18
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.06.2017, 11:30
%s подразумевает строку, а не один символ.
0
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 37
27.06.2017, 11:34  [ТС]
я вводу либо "yes" либо "no". Могу ввести просто "y" или "n". Чтобы я не ввел, программа завершается.
Миниатюры
Программа аварийно завершается после оператора scanf  
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.06.2017, 11:38
Ну если просто буква, то тогда и спецификатор используй для буквы - %c, а для получения результата должен быть передан указатель на приёмник, а не значение как у тебя.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
27.06.2017, 12:02
Цитата Сообщение от alexey15 Посмотреть сообщение
'yes'
в одинарных кавычках указывается один символ.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
27.06.2017, 12:13
Цитата Сообщение от 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  [ТС]
Проблема решилась. Я измени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
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
27.06.2017, 12:34
Цитата Сообщение от alexey15 Посмотреть сообщение
не работает
плейсхолдер s означает, что там будет строка, а строка это всё, что 1 или более символов.
и ещё передавать в scanf надо по указателю, иначе переменная не изменится.
0
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 37
27.06.2017, 12:36  [ТС]
что такое указатель? И как он влияет на переменную?
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
27.06.2017, 12:39
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
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
27.06.2017, 12:41
Цитата Сообщение от alexey15 Посмотреть сообщение
что такое указатель?
переменная, хранящая адрес другой переменной, либо nullptr, либо мусор.
Цитата Сообщение от alexey15 Посмотреть сообщение
И как он влияет на переменную?
если ты передаешь просто так, то как scanf узнает, какую переменную надо менять?
если передаешь по указателю, то она использует хранящийся в указателе адрес для того, чтобы записать по этому адресу введенное тобою значение.

в scanf можно передавать переменные с помощью оператора взятия адреса, в твоем случае: scanf("%c", &approve);.
0
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 37
27.06.2017, 12:49  [ТС]
Я так полагаю это вопрос организации памяти.
Но как выглядит этот указатель? Я правильно понимаю, что в таком случае он должен быть отдельным для каждой переменной? И почему имя переменной не может само по себе быть указателем? Оно же уникально, как ДНК человека.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
27.06.2017, 12:56
Цитата Сообщение от 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  [ТС]
Это выдержка из учебника по Бэйсику. Вы про этого говорили?
Последним необязательным символом имени переменной может быть один из знаков объявления типа переменной (%, !, #, $):
знак % определяет перемешгую целого типа
знак ! — переменная с обычной точностью
знак # — переменная с двойной точностью
знак $ — строковая переменная.
Имена, отличающиеся друг от друга лишь последним знаком, воспринимаются как различные переменные. Например, N%, N!, N#, N$ — имена различных переменных.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
27.06.2017, 12:58
Цитата Сообщение от alexey15 Посмотреть сообщение
И почему имя переменной не может само по себе быть указателем?
Может. Называется "ссылка". Но это в C++, а scanf - темное наследие Си.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
27.06.2017, 12:59
брось ты уже свой бейсик, это не бейсик, а с++, тут много чего по-другому и не стоит опираться на опыт работы с бейсиком.
0
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 37
27.06.2017, 13:05  [ТС]
Объясните мне, в каких случаях значение переменной должно равнять одному символу? Ведь бывают же случаи, когда мы не знаем, какое значение примет переменная. Это может быть один символ/цифра, много символов. Не проще ли сразу указывать все строковые переменные типа string? Зачем нужен char?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
27.06.2017, 13:15
Цитата Сообщение от alexey15 Посмотреть сообщение
Объясните мне, в каких случаях значение переменной должно равнять одному символу?
Например, когда нужно проверить что этот один символ является буквой.
Цитата Сообщение от alexey15 Посмотреть сообщение
Не проще ли сразу указывать все строковые переменные типа string?
Проще, но дороже. Стринг резиновый, для резиновости дергает динамическую память, а выделение динамической памяти - процесс не самый быстрый. Тогда как под какой ни будь сишный char str[128] память выделяется практически мгновенно.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
27.06.2017, 13:21
Цитата Сообщение от Renji Посмотреть сообщение
Стринг резиновый, для резиновости дергает динамическую память, а выделение динамической памяти - процесс не самый быстрый.
Вообще-то есть SSO и для малых строк будет тот же char массив.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.06.2017, 13:21
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru