Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.03.2011, 00:34   #1
aktec
 
Регистрация: 06.03.2011
Сообщений: 5
По умолчанию printf печатает последнее введеное в scanf

После того, как в функции через scanf() или gets ввожу строку, то, возвращаясь в майн, первый по счету printf или cout вместо того, что надо, выводят то, что я вводил в scanf()? Аналогично, сразу после нескольких printf в майн, в функции потом первый scanf() или gets() пропускаеться. Дальше (после первого) все работает нормально.

Много гуглил, всего поначитал, что там буффер переполняется и что строка выходит за ограничение.. Но точной причины и решения не нашел

Вот код:
Код:
int n,l;
FILE *St;
char *s=new char[38],*v;

struct stud
{int kurs;
int exm;
char fio[40];
int *Marks;
int pr;};

void Open_file()
{int o;
printf("Input file name (max length = 32): ");
scanf("%s",v);                                              //после этого scanf пропускаеться первый принтф в майн.
if((St=fopen(s,"r"))==NULL)
{	cout<<"File not found!\n1 Create, 2 Not create : ";
   cin>>o;
   if (o-2)    St=fopen(s,"w");
}fclose(St);};

void Write_Add(int m)                             
{...

for(int i=0; i<n; i++)
{	cout<<"\nstudent "<<(i+1)<<endl<<"Name: ";
	gets(A.fio);                         //вот этот gets пропускается, после принтф-ов в майн
	...   }
....
fclose(St);};
...
void main()
{int q;
s="file\\\\";
v=s+6;
while(1)
{printf("\n\r");   //вот этот принтф работает неправильно
printf("1 Open file");
....
printf("6 Exit\n\r");
cin>>q;
switch(q)
{  case 1:Open_file(); break;
.....
}; //End of switch
}; //End of while
}; //end of Main

Последний раз редактировалось aktec; 06.03.2011 в 00:40.
aktec вне форума Ответить с цитированием
Старый 06.03.2011, 00:56   #2
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

не используйте вообще scanf() , используйте gets(),
если введете в scanf "привет как дела" - получите только "привет", остальное провалится хз куда.
также полезная функция fflush(stdin);
onewho вне форума Ответить с цитированием
Старый 06.03.2011, 01:05   #3
aktec
 
Регистрация: 06.03.2011
Сообщений: 5
По умолчанию

Я так понимаю, что fflush(stdin); очищает этот самый "буфер"?

Именно с таким пониманием работы данной функции вставил её перед проблемными местами, а scanf заменил на gets.

Но проблема не исчезла
aktec вне форума Ответить с цитированием
Старый 06.03.2011, 06:32   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

1. Кто под v выделяет память?
2. У scanf для параметра %s советуют указывать размер.
p51x вне форума Ответить с цитированием
Старый 06.03.2011, 10:12   #5
aktec
 
Регистрация: 06.03.2011
Сообщений: 5
По умолчанию

*v, как можно заметить, объявляется вне функий, а сразу после #include. Но впервые эта переменная определяеться в майн как указатель на 7-ой символ строки s

Последний раз редактировалось aktec; 06.03.2011 в 10:22.
aktec вне форума Ответить с цитированием
Старый 07.03.2011, 07:59   #6
aktec
 
Регистрация: 06.03.2011
Сообщений: 5
По умолчанию

Ап... Помогите пожалуйста все-таки. Я два вечера себе ломаю уже.. и так и сяк...
aktec вне форума Ответить с цитированием
Старый 07.03.2011, 10:37   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Но впервые эта переменная определяеться в майн как указатель на 7-ой символ строки s
Это ясно и без коментариев. Но как вы в стат. строку длиной 8 собираетесь впихнуть еще 32 символа?
p51x вне форума Ответить с цитированием
Старый 07.03.2011, 15:13   #8
aktec
 
Регистрация: 06.03.2011
Сообщений: 5
По умолчанию

Внимательный читатель заметит, что s при объявлении объявляеться (простите за тавтологию) как динамический массив размерностью 38

Последний раз редактировалось aktec; 07.03.2011 в 17:12.
aktec вне форума Ответить с цитированием
Старый 07.03.2011, 17:14   #9
Ivashka12
Новичок
Джуниор
 
Регистрация: 07.03.2011
Сообщений: 1
По умолчанию

Попробуй функцию очистки буфера клавиатуры поставить после scanf. И stdio.h обязательно подключен должен быть.
Ivashka12 вне форума Ответить с цитированием
Старый 07.03.2011, 20:41   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Код:
s="file\\\\";
сравните s до и после этой строки
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
лабораторная работа printf/scanf elenai Общие вопросы C/C++ 2 27.12.2010 10:47
лабораторная работа С++(printf/scanf) elenai Помощь студентам 0 26.12.2010 21:50
в массиве последнее значение само меняется при использовании оператор printf Petruha-nsk Общие вопросы C/C++ 2 19.09.2010 12:45
обработка ошибки, scanf(), Си. krwlr Помощь студентам 3 05.04.2010 16:58
Проблемы системы ввода/вывода C (stdio.h, printf(), scanf()...) vladislavchick Помощь студентам 2 21.02.2010 13:30