Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
FokycHuk
0 / 0 / 0
Регистрация: 04.04.2016
Сообщений: 6
1

Необработанное исключение по адресу при вводе даты

04.04.2016, 18:52. Просмотров 928. Ответов 8
Метки нет (Все метки)

имеется код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <iostream>
#include <conio.h> 
using namespace std;
 
 
int main() 
{ 
int day, year; 
char month[10]; 
printf_s("Vvedite day month year\n"); 
scanf_s("%d %s %d", &day, &month, &year); 
printf_s("Segodny %d %s %d", day, month, year);  
return 0; 
}
по заданию:
Пусть формат ввода даты с экрана имеет вод: 5 Septemba 2005
Как следует модифицировать приведенную выше программу для ввода даты?

у моего соседа по комнате данный код работает, у меня же приходится добавлять "_s" чтобы он хотябы запускался
все идет до тех пор пока я не ввожу "Septemba" то есть пока не забиваю масив.
далее происходит следующее
ошибок в обычном коде не выдает, но ссылается на ассемблер
0
Миниатюры
Необработанное исключение по адресу при вводе даты  
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2016, 18:52
Ответы с готовыми решениями:

Необработанное исключение по адресу, нарушение прав доступа при записи по адресу
вот само задание: Авиарейсы (номер рейса, пункт назначения, время вылета, дата вылета, стоимость...

Исправить ошибку: необработанное исключение по адресу, нарушение прав доступа при записи по адресу
Помогите, пожалуйста, исправит ошибку. Необработанное исключение по адресу 0x77D88E19 (ntdll.dll)...

Необработанное исключение по адресу 0x00105FD7 в Динамические структуры: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCDCDCE09
Необработанное исключение по адресу 0x00105FD7 в Динамические структуры.exe: 0xC0000005: нарушение...

Необработанное исключение по адресу 0x00ED4891 в strings.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCCCCCCCC
Программа толком не написан, проверял ранд и возникли проблемы. Ф-ция ранд генерирует одно и тоже...

Необработанное исключение по адресу 0x001B3371 в XXX.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFDF
Делал консольную змейку и столкнулся вот с такой проблемой. void stena(char **arr) { int y...

8
pav1uxa
1895 / 1736 / 816
Регистрация: 23.01.2014
Сообщений: 6,152
Завершенные тесты: 1
04.04.2016, 21:48 2
Цитата Сообщение от FokycHuk Посмотреть сообщение
у моего соседа по комнате данный код работает, у меня же приходится добавлять "_s"
Возьмите у соседа по комнате нормальную среду для программирования с его компиляторами)
0
nikolay1982
124 / 124 / 59
Регистрация: 22.01.2014
Сообщений: 460
04.04.2016, 22:02 3
Лучший ответ Сообщение было отмечено FokycHuk как решение

Решение

Цитата Сообщение от FokycHuk Посмотреть сообщение
scanf_s("%d %s %d", &day, &month, &year);
Дело в том, что у вам массив символов, имя(month) которого на языке C можно рассматривать как указатель на первый элемент массива.
При передачи в функцию, именно это и работает, передается как указатель. Поэтому не стоит дополнительно брать указатель на указатель на первый элемент массива.
Поэтому правильно так:
C++
1
scanf("%d %s %d", &day, month, &year);
Или же так:
C++
1
scanf("%d %s %d", &day, &month[0], &year);
Второй вариант &month[0] более знаком тем, кто привык использовать массивы в Pascal в качестве указателей(там было бы @month[0]).
0
djair
1 / 2 / 4
Регистрация: 22.09.2015
Сообщений: 12
04.04.2016, 23:26 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <iostream>
#include <conio.h> 
using namespace std;
 
 
int main()
{
    int day, year;
    char month[10];
    cout << "Vvedite day month year" << endl;
    cin >> day;
    cin >> month;
    cin >> year;
    cout << day << " " << month << " " << year << endl;
    return 0;
}
а так не проще сделать?
0
04.04.2016, 23:26
FokycHuk
0 / 0 / 0
Регистрация: 04.04.2016
Сообщений: 6
05.04.2016, 00:28  [ТС] 5
первый вариант уже перепробовал нет никаких изменений, второй проверил, так же без изменений

Добавлено через 48 секунд
целевую функцию надо оставить

Добавлено через 5 минут
Цитата Сообщение от nikolay1982 Посмотреть сообщение
Дело в том, что у вам массив символов, имя(month) которого на языке C можно рассматривать как указатель на первый элемент массива.
При передачи в функцию, именно это и работает, передается как указатель. Поэтому не стоит дополнительно брать указатель на указатель на первый элемент массива.
Поэтому правильно так:
C++
1
scanf("%d %s %d", &day, month, &year);
Или же так:
C++
1
scanf("%d %s %d", &day, &month[0], &year);
Второй вариант &month[0] более знаком тем, кто привык использовать массивы в Pascal в качестве указателей(там было бы @month[0]).
так вот оба способа испробованны а результат тотже, все таже ошибка и отправление к языку на ассемблере

Добавлено через 1 минуту
Цитата Сообщение от pav1uxa Посмотреть сообщение
Возьмите у соседа по комнате нормальную среду для программирования с его компиляторами)
дело в том что мне охота разобраться, а иначе в чем смысл)

Добавлено через 8 минут
Цитата Сообщение от djair Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <iostream>
#include <conio.h> 
using namespace std;
 
 
int main()
{
    int day, year;
    char month[10];
    cout << "Vvedite day month year" << endl;
    cin >> day;
    cin >> month;
    cin >> year;
    cout << day << " " << month << " " << year << endl;
    return 0;
}
а так не проще сделать?
надо решить именно через этот способ
0
DrOffset
11004 / 5874 / 1443
Регистрация: 30.01.2014
Сообщений: 9,471
05.04.2016, 08:41 6
Лучший ответ Сообщение было отмечено FokycHuk как решение

Решение

FokycHuk, читаем здесь: https://msdn.microsoft.com/en-us/library/w40768et.aspx
Unlike scanf and wscanf, scanf_s and wscanf_s require the buffer size to be specified for all input parameters of type c, C, s, S, or string control sets that are enclosed in []. The buffer size in characters is passed as an additional parameter immediately following the pointer to the buffer or variable.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <iostream>
 
int main() 
{ 
    int day, year; 
    char month[10]; 
    printf_s("Vvedite day month year\n"); 
    scanf_s("%d %9s %d", &day, month, sizeof(month), &year); 
    printf_s("Segodny %d %s %d", day, month, year);  
    return 0; 
}
Естественно, замечание из 3го поста это никак не отменяет. Оно абсолютно правомерено.
0
Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
05.04.2016, 09:41 7
Цитата Сообщение от FokycHuk Посмотреть сообщение
Septemba
=) Это новый язык, как английский только ещё хуже..

+ к предыдущим постам, и разширь char массив, т.к. скорее всего ещё и мало места, т.к. если ты вводиш реальное слово "September", то это 9 символов +1 символ для \0, а если ты ошибаешся с вводом на 1 элемент, то вылетает, брать надо с запасом, а у тебя запаса нет.
0
FokycHuk
0 / 0 / 0
Регистрация: 04.04.2016
Сообщений: 6
05.04.2016, 15:44  [ТС] 8
Цитата Сообщение от DrOffset Посмотреть сообщение
FokycHuk, читаем здесь: https://msdn.microsoft.com/en-us/library/w40768et.aspx


C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <iostream>
 
int main() 
{ 
    int day, year; 
    char month[10]; 
    printf_s("Vvedite day month year\n"); 
    scanf_s("%d %9s %d", &day, month, sizeof(month), &year); 
    printf_s("Segodny %d %s %d", day, month, year);  
    return 0; 
}
Естественно, замечание из 3го поста это никак не отменяет. Оно абсолютно правомерено.
спасибо, возврат размера помог, но всеже остался один вопрос в чем же тогда отличия почему мне пришлось писать именно так и соседу, именно с тем же кодом это не понадобилось? (у него VS 2010 у меня VS 2012 )
0
DrOffset
11004 / 5874 / 1443
Регистрация: 30.01.2014
Сообщений: 9,471
05.04.2016, 16:36 9
Цитата Сообщение от FokycHuk Посмотреть сообщение
соседу, именно с тем же кодом это не понадобилось?
Ему "повезло".
Если у него был именно такой код (со scanf_s и без указания размера), то он у него точно так же некорректен, как был у тебя. Ошибка совсем необязатально должна выражаться в падении программы. Ты поймешь это на своей шкуре, если будешь потом работать программистом.
В общем, ссылку я выше дал, там все написано. И про отличия scanf от scanf_s, и зачем они нужны, и как правильно ими пользоваться. Если правда хочешь разобраться - читай, вникай.
0
05.04.2016, 16:36
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2016, 16:36

Необработанное исключение по адресу при выводе на консоль
Доброго времени суток. #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class...

Необработанное исключение по адресу (msvcp110d.dll): нарушение прав досупа при записи
Доброго времени суток. Надеюсь на вашу помощь в решении моей проблемы. Я имею две функции, первая...

Необработанное исключение по адресу 0x008B94C5. 0xC0000005: нарушение прав доступа при чтении по
Здравствуйте! Функция должна искать локальные минимумы массива. То есть это элементы,которые меньше...


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

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

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