Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: gets(s); не работает, что я не так сделал?  (Прочитано 19296 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Sample
Гость
« : 10-04-2004 21:08 » 

Полностью не работает программа, оператор gets ничего не делает (проблема сортировки отошла на второй план)
Код:
#include <string.h>
#include <conio.h>
#include <stdio.h>
void form_name(char[],char[][100],int &);
void print_name (char[][100],int);
void main()
{       //объявление переменных
char y[100],w[20][100];
int m,n,k;

//цвет фона, заставка и т.п.
textbackground (0);
clrscr();
gotoxy(21,10);
printf("имя фамилия, группа");
getch();

// Главное меню
do{
clrscr();
printf ("1-Ввод фамилий учеников\n");
printf ("2-Ввод названий предметов\n");
printf ("3-Генерация оценок\n");
printf ("4-Просмотр исходных данных\n");
printf ("5-Сортировка\n");
printf ("6-Выход\n\n");
scanf("%i",&n);

switch (n)
{
case 1:
form_name (y,w,k);
break;
case 2:
print_name (w,k);
break;
case 6: break;

default:printf ("\nможно с 1 по 6!!!");
getch();
break;
}
} while(n!=6);
}
void form_name(char s[],char w[][100],int &k)
{       //формирование фамилий из строки

char * p;
int i;
k=0;
clrscr();
printf ("Введите фамилии учеников: ");
gets(s);
p=strtok(s, " ,");
while (p!=NULL)
|if (strlen(p)>0)
|strcpy (w[k],p);
k++;}
p=strtok(NULL," ,");}
}
void print_name (char w[][100],int k)
{ //вывод исходных данных
int i;
clrscr();
for (i=0;i<k;i++)
puts(w[i]);
getch();
}
уже совсем замучился, объясните, что я делаю не так!!   Так больше нельзя...
« Последнее редактирование: 25-11-2007 16:59 от Алексей1153++ » Записан
Sashok
Молодой специалист

us
Offline Offline
Пол: Мужской

« Ответ #1 : 10-04-2004 23:32 » 

Sample, твои проблемы связаны с буферированием. Если хочешь совмещать scanf() и gets(), getch() в одной программе, добавляй после scanf() вызов flushall().
Записан

Если бы окружающие нас объекты содержали столько же ошибок, сколько программы, цивилизация обрушилась бы от первого порыва ветра...
Sample
Гость
« Ответ #2 : 11-04-2004 05:10 » 

Sashok, Большое человеческое СПАСИБО!!!
Записан
Sample
Гость
« Ответ #3 : 11-04-2004 05:21 » 

Только, как это объяснить преподавателям? (в смысле, если спросят для чего это нужно)
PS. В интернете посмотрел, цитирую:
Цитата
Функция flushall сбрасывает все буфера, связанные с
                   открытыми   входными   потоками,   и  записывает  в
                   соответствующие файлы  все  буфера,  относящиеся  к
                   открытым  выходным потокам.  Любые операции чтения,
                   следующие за функцией flushall будут  читать  новые
                   данные для входных файлов в буферы.

А как будет в переводе на русский?
Записан
Xeysan
Гость
« Ответ #4 : 11-04-2004 16:48 » 

Просто эти функции не обязательно всё сразу пишут в поток, для повышения быстродействия данные могут накапливаться, для того чтобы потом быть записаннами одной операцией. Функция flushall(), fflush( stream ), препятствует буферизации, и заставляют "сбросить балласт" Улыбаюсь
Записан
Sashok
Молодой специалист

us
Offline Offline
Пол: Мужской

« Ответ #5 : 12-04-2004 04:26 » new

Sample, не дай Бог, тебе совсем тупой препод попадется - ничего не объяснишь! Улыбаюсь

А вообще-то, примерно так. Ввод и вывод буферируются в scanf() и printf(), соответственно. А функции семейства flush не подавляют буферирование, а осуществляют однократную принудительную очистку буфера.

Кстати, если работаешь на Юниксе, можешь продемонстрировать преподавателю интересный эффект. Пишешь что-нибудь вроде:
Код:
...
printf("Hello");
fork();
...
Знаешь, что будет? Слово "Hello" выведется 2 раза. И знаешь почему? Потому, что оно оказывается в буфере, и в момент создания дочернего процесса ( fork(); ), когда копируется весь контекст, буфер тоже копируется. Соответственно, оба процесса потом выведут этот текст.
Этого не произойдет, если перед fork() вызвать flush().
« Последнее редактирование: 25-11-2007 17:00 от Алексей1153++ » Записан

Если бы окружающие нас объекты содержали столько же ошибок, сколько программы, цивилизация обрушилась бы от первого порыва ветра...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines