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

Ошибка исполнения "string != nullprt"

24.04.2018, 01:00. Показов 1605. Ответов 16

Студворк — интернет-сервис помощи студентам
Здравствуйте, консоль выдает ошибку Debug Assertion Failed! Line: 31 Expression: string != nullprt
Суть программы - калькулятор, но нужно выявить и исключить ошибки, например на 0 делить нельзя.
Вот код программы:
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
#include <iostream>
#include <cstdlib>
#include <conio.h>
using namespace std;
double a, b;
int main(int argc, char* argv[]) {
    setlocale(LC_ALL, "Russian");
    if (argc != 4)
        cout << "Введите пожалуйста в формате (a ; +, -, *, / ; b)" << endl;
    if (sizeof (argv[2]) != 1)
        cout << "Введите пожалуйста в формате (a ; +, -, *, / ; b)" << endl;
    a = strtod(argv[1], NULL);
    b = strtod(argv[3], NULL);
    
    if ('+' == argv[2][0])
        cout << a + b << endl;
    if ('-' == argv[2][0])
        cout << a - b << endl;
    if ('*' == argv[2][0])
        cout << a * b << endl;
    if ('/' == argv[2][0])
        cout << a / b << endl;
    
    try {
        if (b == 0)
            throw 1;
        cout << a / b << endl;
        }
    catch (int i) {
        cout << "Ошибка №" << i << " - деление на ноль!" << endl;
        }
    try {
        if (argv[2][0] != '+', '/', '*', '-')
            throw 2;
        }
    catch (int o) {
        cout << "Ошибка №" << o << " - использование неккоретного символа!" << endl;
        }
    _getch();
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.04.2018, 01:00
Ответы с готовыми решениями:

Ошибка исполнения
При вводе &quot;ARozA upalaNalapu AzoRA&quot; выводит &quot;Yes&quot; без ошибки, а при вводе &quot;A RozA upala Na lapu AzoRA&quot; выводит &quot;No&quot; и выдаёт...

Ошибка исполнения
Вводиться и выводиться без ошибок, но иногда выводит ошибку исполнения. Пожалуйста, подскажите где может быть ошибка? Для понимания: ...

Ошибка во время исполнения
Здравствуйте, вылазит ошибка: Debug Assertion Failed! Expression: string subscript out of range while(getline(ffc, bffc)) { int...

16
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
24.04.2018, 01:11
Цитата Сообщение от Egorchan Посмотреть сообщение
Выдает ошибку
В какой строке кода?
1
0 / 0 / 0
Регистрация: 24.04.2018
Сообщений: 15
24.04.2018, 01:17  [ТС]
Само окно ошибки выдает line: 31, пытаюсь через F11 найти ошибку, но на 9 строке лезет в System. К сожалению не особо знаю, как дальше делать.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
24.04.2018, 01:21
Цитата Сообщение от Egorchan Посмотреть сообщение
пытаюсь через F11
Через F10 найди.
1
31 / 26 / 26
Регистрация: 04.04.2018
Сообщений: 83
24.04.2018, 01:24
Лучший ответ Сообщение было отмечено Egorchan как решение

Решение

Дело в том, что ты, скорее всего, запускаешь программу без параметров входной строки. Поэтому в этой строке
C++
1
a = strtod(argv[1], NULL);
функция пытается обратиться к несуществующему элементу массива argv[1], что и вызывает ошибку. Об этом и говорит сообщение Expression: string != nullprt (указатель на строку не может быть нулевым).

Необходимо проверять количество элементов в массиве, прежде чем обращаться к какому-либо его элементу по индексу.
1
0 / 0 / 0
Регистрация: 24.04.2018
Сообщений: 15
24.04.2018, 01:48  [ТС]
vglv, vglv, А каким образом это можно исправить? Просто на другой версии студии (Более старой, если не ошибаюсь, либо 98, либо 14 года) программа работала. Пришел домой, попробовал - ошибка. Отчетливо помню, что свободно можно было вводить 3 параметра в консоли (Например: 1 + 1) и он выводил ответ. А здесь никак, второй час пытаюсь исправить ошибку.
0
31 / 26 / 26
Регистрация: 04.04.2018
Сообщений: 83
24.04.2018, 02:02
Лучший ответ Сообщение было отмечено Egorchan как решение

Решение

Предлагаю примерно так:
C++
1
2
3
4
5
6
7
8
9
10
std::string input;
if (argc < 4 || strlen(argv[2]) != 1) {
    cout << "Введите пожалуйста в формате (a ; +, -, *, / ; b)" << endl;
    cin >> input;
    // далее код получения a и b из строки input
}
else if (argc >= 4) {
    a = strtod(argv[1], NULL);
    b = strtod(argv[3], NULL);
}
Обрати внимание, что я заменил sizeof на strlen, так как именно strlen получает длину строки (а именно проверка длины строки тебе и нужна, насколько я понял). sizeof возвращает объем памяти в байтах, необходимый для хранения объекта, к которому этот оператор применяется. В твоем коде sizeof применяется к argv[2], argv[2] - это указатель на начало строки char *, а объем указателя равен 4 байтам.
Обращение к элементам argv[1] и argv[3] в этом коде гарантированно происходит только при существовании этих элементов.
В твоем начальном коде нет оператора приема данных с консоли типа cin или scanf, поэтому не совсем понятно, как именно программа принимала с консоли данные.
0
0 / 0 / 0
Регистрация: 24.04.2018
Сообщений: 15
24.04.2018, 02:13  [ТС]
vglv, vglv, Спасибо Вам огромное за исправление моего кода. Правда возникла другая проблема. Компилятор стал ругаться на то, что в 4 строчке (Относительно Вашего кода) отсутствует оператор ">>", соответствующий этим операндам типы операндов: std::istream >> std::string. Что это может быть?
0
31 / 26 / 26
Регистрация: 04.04.2018
Сообщений: 83
24.04.2018, 02:24
Оператор cin - это из старого Си, std::string - из C++. У меня cin с std::string работает, но на некоторых компиляторах может не работать.
Попробуйте заменить cin на std::cin.

Добавлено через 4 минуты
Хотя могу ошибаться, у вас же упоминается std::istream... Надо подумать.
0
0 / 0 / 0
Регистрация: 24.04.2018
Сообщений: 15
24.04.2018, 02:25  [ТС]
К сожалению не помогло
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
24.04.2018, 02:30
Лучший ответ Сообщение было отмечено Egorchan как решение

Решение

Цитата Сообщение от Egorchan Посмотреть сообщение
Что это может быть?
#include <string> наверное нет.
0
31 / 26 / 26
Регистрация: 04.04.2018
Сообщений: 83
24.04.2018, 02:33
Попробуйте оператор
C++
1
getline (cin, input);
Также можно попробовать:
C++
1
2
char str[100];
gets(str);
Выше я ошибочно написал, что cin - это из старого Си. Это из C++.
0
0 / 0 / 0
Регистрация: 24.04.2018
Сообщений: 15
24.04.2018, 02:42  [ТС]
nd2 Спасибо большое. Помогло

Добавлено через 3 минуты
vglv Комментарий выше от пользователя nd2 помог. Программа стала работать без ошибок, но выдает сразу же cout об ошибки, не дав ввести значения. Не подскажите пожалуйста, как можно исправить это? Не особо разбираюсь в argc и argv. Знаю считай только то, что argc - argumentcout и там пишется, сколько параметров, а argv - argumentvalue - и это что-то типо структуры. И то в этом не уверен, к сожалению.
0
31 / 26 / 26
Регистрация: 04.04.2018
Сообщений: 83
24.04.2018, 02:46
Egorchan, какое именно сообщение об ошибке выдается? Приведите код программы, как он у вас выглядит сейчас.
Также, каким образом вы запускаете программу? Запускаете прямо из среды разработки, или из командной строки? Передаете в программу какие-либо параметры командной строки, и если да, то какие?
0
0 / 0 / 0
Регистрация: 24.04.2018
Сообщений: 15
24.04.2018, 02:50  [ТС]
vglv Вот:
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 <iostream>
#include <cstdlib>
#include <conio.h>
#include <string>
using namespace std;
double a, b;
int main(int argc, char* argv[]) {
    setlocale(LC_ALL, "Russian");
    string input;
    if (argc < 4 || strlen(argv[2]) != 1) {
        cout << "Введите пожалуйста в формате (a ; +, -, *, / ; b)" << endl;
        cin >> input;
    }
    else if (argc >= 4) {
        a = strtod(argv[1], NULL);
        b = strtod(argv[3], NULL);
    }
 
    if ('+' == argv[2][0])
        cout << a + b << endl;
    if ('-' == argv[2][0])
        cout << a - b << endl;
    if ('*' == argv[2][0])
        cout << a * b << endl;
    if ('/' == argv[2][0])
        cout << a / b << endl;
 
    try {
        if (b == 0)
            throw 1;
        cout << a / b << endl;
    }
    catch (int i) {
        cout << "Ошибка №" << i << " - деление на ноль!" << endl;
    }
    try {
        if (argv[2][0] != '+', '/', '*', '-')
            throw 2;
    }
    catch (int o) {
        cout << "Ошибка №" << o << " - использование неккоретного символа!" << endl;
    }
    _getch();
    return 0;
}
Консоль выводит следующее: Введите пожалуйста в формате (a ; +, -, *, / ; b)
0
31 / 26 / 26
Регистрация: 04.04.2018
Сообщений: 83
24.04.2018, 03:11
Egorchan, что делает программа после вывода этого сообщения? Ждет ли она, пока пользователь не введет в консоль какую-либо строку?

Если можно ввести строку в консоль, то строка записывается в переменную input. Строки должны быть вида
3 * 11
7 - 2
8 / 4
43 * 11
и т. д., насколько я понял.
Если строки должны быть такого вида, то непонятно тогда, кстати, почему изначальный код ожидает 4 параметра в командной строке, а не 3...

Далее, со строкой input необходимо проделать следующее:
1. Разбить на три подстроки (организовать метод split для std::string, можно найти примеры в гугле)
2. Преобразовать первую подстроку в число и записать в a, преобразовать третью подстроку в число и записать в b; из второй подстроки извлечь символ операции
3. При этом, если количество подстрок, на которые разбивается input, не равно 3, либо первая или третья подстрока не являются числовыми значениями, либо длина второй подстроки не равняется 1 или она не равняется символу операции, то необходимо вывести сообщение об этом в консоль и попросить ввести строку снова (желательно организовать ввод и преобразование подстроки в цикле, пока не будет введена верная строка).
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
24.04.2018, 10:06
Цитата Сообщение от vglv Посмотреть сообщение
Оператор cin - это из старого Си
cin - это не оператор. Это объект класса std::basic_istream, определённого в заголовочном файле istream, у которого (объекта) перегружен оператор >>.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.04.2018, 10:06
Помогаю со студенческими работами здесь

Ошибка этапа исполнения
Доброго времени суток! Хочу разобраться с ошибкой, буду благодарна за помощь) Вот код функции: void addCard ( sDeck* oldDeck,...

Ошибка этапа исполнения
Всем доброго времени суток! Пытаюсь решить вот эту задачу: В ряд выложены N кучек камней, в i-ой из которых было Qi камней. В любой...

Ошибка во время исполнения
Добрый день. Написал программу. Когда запускаю на своем компиляторе то все работает исправно, а если загружаю на сайт, то выдает ошибку ...

Ошибка во время исполнения
При попытке запустить программу Visual Studio пишет: Unhandled exception at 0x011027ce in GLTore.exe: 0xC0000005: Access violation...

Ошибка исполнения С3861
#include &lt;iostream&gt; #include &lt;Windows.h&gt; using namespace std; struct Node { char *firstname; char *name; char *lastname; ...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru