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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2008, 15:32   #1
pushok
 
Регистрация: 14.01.2008
Сообщений: 8
По умолчанию Строки в Си

Вообщем решаю задачу про структуры (struct) Си.
Надо ввести Фамилию и инициалы.
Вообщем все вроде нормально, но фамилию со второго раза и дальше пропускает.
Подскажите. В чем проблема? Может быть неправильно считываю строки? Как лучше?

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

int const n=2;

struct student
{
char surname[20];
char init[2];
int group;
int mark[5];
};

void s_in(student m[n]);

void main()
{
student st[n];
s_in(st);
getch();
}

void s_in(student m[n])
{
printf("\n");
char c;
for(int i=0;i<n;i++)
	{
   printf("\n --- Student # %d ---",(i+1));
   printf("\nSurname: ");
	c=getchar();
   for(int e=0;c!='\n';e++)
   	{
      m[i].surname[e]=c;
      c=getchar();
      }
   printf("Initials: ");
   for(int e=0;(c=getchar()) && e<2;++e) m[i].init[e]=c;
   printf("Group index: ");
   scanf("%d",&m[i].group);
	for(int e=0;e<5;e++)
   	{
      printf("Mark %d: ",(e+1));
      scanf("%d",&m[i].mark[e]);
      }
   printf("\n --- --- ---");
   }
}
pushok вне форума Ответить с цитированием
Старый 17.04.2008, 16:34   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Вообще говоря эту проблему можно решить расстановкой
Код:
fflush(stdin);
в нужных местах (перед чтением из stdin) - после scanf в stdin остается '\n', но, если честно, уж очень странный способ - читать строки гетчаром. Можно скажем так:
Код:
void s_in(struct student m[n])
{
	char c;
	printf("\n");
	for(int i=0;i<n;i++){
		
		printf("\n --- Student # %d ---\n",(i+1));
		
		printf("Surname: ");
		fflush(stdin);
		fgets(m[i].surname, sizeof(m[i].surname), stdin);

		printf("Initials: ");
		fflush(stdin);
		fgets(m[i].init, sizeof(m[i].init), stdin);

		printf("Group index: ");
		fflush(stdin);
		scanf("%d",&m[i].group);
		
		for(int e=0;e<5;e++){
			printf("Mark %d: ",(e+1));
			fflush(stdin);
			scanf("%d",&m[i].mark[e]);
		}
		printf("\n --- --- ---");
	}
}
B_N вне форума Ответить с цитированием
Старый 17.04.2008, 17:40   #3
pushok
 
Регистрация: 14.01.2008
Сообщений: 8
По умолчанию

Спасибо большое работает.
Теперь если не сложно расскажите что есть что:

1.
fflush - Сбрасывает поток
stdin - поток ввода (или буфер ввода)
?

2.
fgets(char *line, int maxline, FILE *fp); - первые два аргумента понятнно (аналогичные), а вместо файла указывается поток ?
pushok вне форума Ответить с цитированием
Старый 17.04.2008, 17:57   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

1.1 - Да
1.2 - поток стандартного ввода (или файл, если угодно)
2. Именно так. Обратите внимание на отличие от gets - здесь можно задать размер принимающего строку буфера.
B_N вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
считать из файла две строки, вывести на экран символы первой строки, которые отсутствуют во второй gotex Помощь студентам 4 08.05.2008 02:27
Строки Настена Помощь студентам 1 07.01.2008 23:47
Строки. Mr.User Помощь студентам 11 08.12.2007 07:00
как вывести строку поочередно сначала первая буква первой строки потом первая буква второй строки и т.д. vitalik007 Помощь студентам 1 25.09.2007 20:45