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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Перевести символ верхнего регистра в нижний и наоборот http://www.cyberforum.ru/cpp-beginners/thread560202.html
Подскажите, что не так: нужно введенную строку преобразовать так: символы верхнего регистра в символы нижнего регистра, и наоборот, а цифры(десятичные знаки) не печатать, строка читается до символа...
C++ Матрицы: найти максимальную сумму элементов строк матрицы Лабораторная работа № 7 Функции Цель работы: изучение правил составления и использования функций в программах на С++. Пример Задание. Найти максимальную сумму элементов строк матрицы 3×5 с... http://www.cyberforum.ru/cpp-beginners/thread560199.html
C++ прошу помощи, не могу найти ошибку
#include<iostream> #include<conio.h> #include<stdlib.h> #include<stdio.h> #include<time.h> using namespace std; void draw_line(int n,char ch); void board(); void gamescore(char name1,char...
C++ Рекурсивные деревья
День добрый. Очень нужна помощь в решении задачи: Найти все поддеревья, структура которых совпадает с заданной. Ввод/Создание/Вывод/...дерева написать труда не составило. С рекурсией и...
C++ Нужна программа которая считает угол между двумя заданными векторами (по координатам) http://www.cyberforum.ru/cpp-beginners/thread560159.html
Помогите. Нужна программа которая считает угол между двумя заданными векторами (по координатам)
C++ Построение блок-схемы к существующей программе #include<iostream> using namespace std; #define n 100 int main() { int N, mas={0}, i, j, mas_res, res=0, min, tmp=0; bool mas1={false}; ... подробнее

Показать сообщение отдельно
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1

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

27.04.2012, 15:51. Просмотров 4792. Ответов 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???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru