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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2009, 18:35   #1
U-S
Пользователь
 
Регистрация: 02.08.2009
Сообщений: 24
По умолчанию функция gets

задача:
создать программу, позволяющую вводить элементы массива(не более 30 элементов), содержащие сведения о расписании поездов: день недели, станция назначения, номер поезда, время отправления, и позволяющую по задаваемой станции назначения определить какие поезда отправляются до интересующей станции

реализация:

Код:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

struct railway {
	int number;
	char *day;
	char *station;
	int hour;
	int minutes;
};


main()
{
	railway trains[30];
	char *day[] = {"Monday", "Tuesday", "Wednesday",
		       "Thursday", "Friday", "Saturday",
		       "Sunday"};
	int i, k;
	int d;
	int c;
	char *station;

for(i = 0; i <= 29; i++) {
	printf("\nEnter number of train(enter -1 to end): ");
	scanf("%d", &trains[i].number);
	if (trains[i].number == EOF)
		break;

	printf("\nEnter number day of a week: ");
	scanf("%d", &d);

	switch (d) {

	case 1:
		trains[i].day = day[1];
		break;
	case 2:
		trains[i].day = day[2];
		break;
	case 3:
		trains[i].day = day[3];
		break;
	case 4:
		trains[i].day = day[4];
		break;
	case 5:
		trains[i].day = day[5];
		break;
	case 6:
		trains[i].day = day[6];
		break;
	case 7:
		trains[i].day = day[7];
		break;
	default:
		printf("INCORRECT DATA");
		break;
	}

	printf("\nEnter destination station: ");
	gets(trains[i].station); //при выводе не дает мне ввести название станции, и переходит к следующей строке

	printf("\nEnter a time(Example 20 00): ");
	scanf("%d%d", &trains[i].hour, &trains[i].minutes);

       //	printf("\n\n%d", trains[i].number);
       //	printf("\n%s", trains[i].day);
       //	printf("\n%s", trains[i].station);
       //	printf("\n%d\n%d", trains[i].hour, trains[i].minutes);

}

printf("\n\n***enter station, which interest you***\n");
scanf("%s", &station);
printf("\n\n");

// этот и подобные ему циклы далее рисуют в досе табличку
for (k = 1; k <= 70; k++)
	{
	if (k == 1)
		printf("Х");
	else
		if ( (k == 17) || (k == 33) || (k == 49) )
			printf("В");
		else
			if (k == 70)
				printf("ї");
			else
				printf("Д");
	}

printf("\nі%15sі%15sі%15sі%20sі\n", "number", "day", "hours", "minutes");



for(i = 0; i <= 29; i++) {
	if (trains[i].station == station) {
		for (k = 1; k <= 70; k++)

	{

	if ( (k == 17) || (k == 33) || (k == 49) )
		printf("Е");
	else
		if (k == 70)
			printf("ґ");
		else
			if (k == 1)
				printf("Г");
			else
				printf("Д");


	}

	printf("\nі%15dі%15sі%15dі%20dі\n", trains[i].number, trains[i].day, trains[i].hour, trains[i].minutes);
	}
}

for (k = 1; k <= 70; k++)

	{

	if ( (k == 17) || (k == 33) || (k == 49) )
		printf("Б");
	else
		if (k == 1)
			printf("А");
		else
			if (k == 70)
				printf("Щ");
			else
				printf("Д");
	}



getch();
return 0;
}

использую функцию gets для ввода названия станция, чтобы автоматически добавлялся символ конца строки, программа компилируется, но при выполнении программа не дает мне ввести строку и переходит к следующему пункту

скрин:
http://radikal.ru/F/s61.radikal.ru/i...deb3e.jpg.html
при использовании scanf все работает нормально, но мне нужно чтобы добавлялся символ конца строки.

Последний раз редактировалось Sazary; 16.11.2009 в 00:30.
U-S вне форума Ответить с цитированием
Старый 13.11.2009, 19:16   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

попробуйте так

Код:
printf("\nEnter destination station: ");
fflush(stdin);
gets(trains[i].station); //при выводе не дает мне ввести название станции, и переходит к следующей строке
counter вне форума Ответить с цитированием
Старый 13.11.2009, 19:23   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

а где память под railway::station выделяется? а то пытаться записывать строку в случайный буфер чревато...
pu4koff вне форума Ответить с цитированием
Старый 13.11.2009, 23:48   #4
U-S
Пользователь
 
Регистрация: 02.08.2009
Сообщений: 24
По умолчанию

Цитата:
Сообщение от counter Посмотреть сообщение
попробуйте так

Код:
printf("\nEnter destination station: ");
fflush(stdin);
gets(trains[i].station); //при выводе не дает мне ввести название станции, и переходит к следующей строке
спасибо, помогло
Но хотелось бы знать, почему не работало?

Цитата:
где память под railway::station выделяется? а то пытаться записывать строку в случайный буфер чревато...
А разве, если я использую стурктуру, нужно еще динамически выделять память?
U-S вне форума Ответить с цитированием
Старый 13.11.2009, 23:57   #5
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от U-S Посмотреть сообщение
А разве, если я использую стурктуру, нужно еще динамически выделять память?
Так в структуре оно описано как char *station; Под указатель 4 байта выделится и всё, а вот под строку, на которую он должен будет указывать, нужно уже самому память выделять. Ну, чтобы особо не заморачиваться, можно написать: char station[100];
Кстати, этот длинный некрасивый switch сокращается до краткого:
Код:
if (d >= 1 && d <= 7)
{
  trains[i].day = day[d];
}
else
{
  printf("INCORRECT DATA");
}
pu4koff вне форума Ответить с цитированием
Старый 14.11.2009, 00:45   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от U-S
Но хотелось бы знать, почему не работало?
Проблема кроется в scanf.
Строка форматирования, которую Вы ему передаёте, говорит "взять целое из входного потока", но насчёт того, что нужно ещё захватить и перевод строки scanf не в курсе Потому он остаётся во входном потоке, что и считывает gets( ведь gets читает как раз до перевода строки, потому она, с чувством выполненного долга, возвращает управление программе считав оставленный scanf-ом перевод строки из потока ).
fflush(stdin) стирает всё из буфера входного потока, в том числе и перевод строки, потому это помогает. В принципе можно делать иначе, передавать в scanf вот такую строку форматирования: "%d " - прошу обратить внимание на пробел после %d.

Последний раз редактировалось netrino; 14.11.2009 в 00:54.
netrino вне форума Ответить с цитированием
Старый 14.11.2009, 13:49   #7
U-S
Пользователь
 
Регистрация: 02.08.2009
Сообщений: 24
По умолчанию

Понял, cпасибо всем за пояснения и конструктивные замечания
U-S вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция SL1CK Помощь студентам 3 07.06.2009 17:36
функция Cpluser Общие вопросы C/C++ 2 28.02.2009 23:08
Функция asd48 Помощь студентам 2 21.12.2008 17:17
функция Lemo Помощь студентам 7 24.10.2008 12:54
одна функция потока, а другая функция - член класса запускающего этот поток Дмитрий_Ч Общие вопросы C/C++ 2 27.09.2007 08:50