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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.62
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,917
Записей в блоге: 1
#1

Visual Studio - ошибка в функции scanf - C++

27.04.2012, 15:51. Просмотров 4602. Ответов 4
Метки нет (Все метки)

Задумал решить задачку.
Вася не любит английский язык, но каждый раз старается получить хотя бы четверку за четверть, чтобы оставаться ударником. В текущей четверти Вася заметил следующую закономерность: по нечетным дням месяца он получал тройки, а по четным – четверки. Так же он помнит, в какие дни он получал эти оценки. Поэтому он выписал на бумажке все эти дни для того, чтобы оценить, сколько у него троек и сколько четверок. Помогите Васе это сделать, расположив четные и нечетные числа в разных строчках. Вася может рассчитывать на оценку 4, если четверок не меньше, чем троек.
Ерунда, подумал я! Читаем числа из файла по порядку, нечётные в один массив, чётные сразу вывожу в первую строчку.Затем в цикле вывожу массив нечётных чисел во вторую строчку. Ну и там чего больше заодно подсчитываем.

Так вот моя программа:
причём, ошибка возникает, если переменные делать внешними.
Если объявить их локальными, ошибки не будет.
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
#include <stdio.h>
 
unsigned char date;
unsigned char asize;
unsigned char a[100];
int N;//WRONG
int i;
int main(){
//int i; int N;// Если б я написал так, всё работало бы верно.
freopen("INPUT.TXT", "r", stdin);
freopen("OUTPUT.TXT", "w", stdout);
scanf("%d", &N);
asize=0;
i=N;
///i=N=5
while(i--){
    scanf("%d", &date);//date=4; i=0 уже в первом проходе цикла WTF???
                                    //сразу после scanf
    if(date&1){
        printf("%d ", date);
    }else{
        a[asize]=date;
        asize++;
    }
 
}
printf("\n");
N-=(asize<<1);
while(asize--)printf("%d ", a[asize]);
if (N>=0)printf("\nYES");else printf("\nNO");
return 0;
}
Причём ошибка происходит где-то в функции scanf
Assembler
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
scanf("%d", &N);
00C81439  mov         esi,esp 
00C8143B  push        offset N (0C871ACh) 
00C81440  push        offset string "%d" (0C85750h) 
00C81445  call        dword ptr [__imp__scanf (0C882CCh)] 
00C8144B  add         esp,8 
00C8144E  cmp         esi,esp 
00C81450  call        @ILT+325(__RTC_CheckEsp) (0C8114Ah) 
asize=0;
00C81455  mov         byte ptr [asize (0C87140h)],0 
i=N;
00C8145C  mov         eax,dword ptr [N (0C871ACh)] 
00C81461  mov         dword ptr [i (0C87144h)],eax 
;///i=N=5
while(i--){
00C81466  mov         eax,dword ptr [i (0C87144h)] 
00C8146B  mov         dword ptr [ebp-0C4h],eax 
00C81471  mov         ecx,dword ptr [i (0C87144h)] 
00C81477  sub         ecx,1 
00C8147A  mov         dword ptr [i (0C87144h)],ecx ;//i--, всё нормально i стало равно 4
00C81480  cmp         dword ptr [ebp-0C4h],0 
00C81487  je          main+136h (0C814F6h) ;//условие цикла тоже выполнилось, заходим в while
    scanf("%d", &date);
00C81489  mov         esi,esp 
00C8148B  push        offset date (0C87141h) 
00C81490  push        offset string "%d" (0C85750h) 
00C81495  call        dword ptr [__imp__scanf (0C882CCh)] 
;///И вот после этого scanfa i обнуляется.!!!!
00C8149B  add         esp,8 ;          WTFWTFWTFWTFWTFWTF
00C8149E  cmp         esi,esp 
00C814A0  call        @ILT+325(__RTC_CheckEsp) (0C8114Ah) ; дальше ещё тело цикла и переход в конце
Добавлено через 5 минут
может это как-то связано с типом unsigned char???
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2012, 15:51     Visual Studio - ошибка в функции scanf
Посмотрите здесь:

Ошибка в Visual Studio 2010 C++
Visual Studio 2008 ошибка C++
Ошибка в visual studio 2010 c++ C++
Аналог функции в Visual Studio C++
C++ Ошибка в Visual Studio
Функции. Сортировка вставками (Visual Studio 2010 C++) C++
C++ Visual Studio - нормально, g++ - ошибка
Ошибка в visual studio 2010 C++
Ошибка или баг Visual Studio 2015? C++
C++ Ошибка установки Visual Studio 2015
Ошибка LNK1561/Visual Studio/ С++ C++
Ошибка в Visual Studio 2010 Express C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
27.04.2012, 16:11     Visual Studio - ошибка в функции scanf #2
new.cpp: В функции «int main()»:
new.cpp:17:22: предупреждение: format «%d» expects argument of type «int*», but argument 2 has type «unsigned char*» [-Wformat]
Как бэ намекает.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,917
Записей в блоге: 1
27.04.2012, 16:12  [ТС]     Visual Studio - ошибка в функции scanf #3
Поставил эксперимент
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
unsigned char date[4]={0xFF, 0xFF, 0xFF, 0xFF};
int i;
//...
int main(){
///...
///...
while(i--){
//до date[4]={0xFF, 0xFF, 0xFF, 0xFF}
scanf("%d", date);//ввод 4
//после date[4]={0x04, 0x00, 0x00, 0x00}
//КАКОГО ЛЕШЕГО??? Я же вам передавал только адрес ПЕРВОГО ЭЛЕМЕНТА???
}
///...
///...
}
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
27.04.2012, 16:20     Visual Studio - ошибка в функции scanf #4
Kuzia domovenok, Ну а спецификатор "%d" соответствует sizeof(int). Т.е. в данном случае 4 байта.

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <cstdio>
 
void trace_bytes(const unsigned char* bytes, size_t length)
{
   for (size_t i = 0; i < length; ++i)
   {
      printf("%d", bytes[i]);
   }
   printf("\n");
}
 
int main()
{
   unsigned char bytes[] = {0x1, 0x2, 0x3, 0x4};
   trace_bytes(bytes, sizeof(bytes));
   scanf("%c", bytes);
   trace_bytes(bytes, sizeof(bytes));
}
Bash
1
2
3
4
forever@pterois:~/My_pro1/cpp_pro$ ./new 
1234
0
48234
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,917
Записей в блоге: 1
27.04.2012, 16:20  [ТС]     Visual Studio - ошибка в функции scanf #5
да, лопухнулся. Как-то я это только сейчас узнал.
Получается невозможно сохранить десятичное число до 255 в однобайтовой переменной?
Почему-то всегда думал, что %d означает десятичная сис.счисления, а для разных размеров есть %ld и.т.п.
Yandex
Объявления
27.04.2012, 16:20     Visual Studio - ошибка в функции scanf
Ответ Создать тему
Опции темы

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