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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2015, 19:55   #1
Neostat
Пользователь
 
Регистрация: 19.10.2014
Сообщений: 49
По умолчанию Проблемы с getc в СИ

Уважаемые форумчане,помогите пожалуйста с одной проблемкой: gets не хочет работать,а scanf читает первое слово до пробела.

По задаче мне нужно создать структуру данных,в которой будут храниться ФИО преподавателя,Кафедра и нагрузка.

Все бы было хорошо,если бы при вводе ФИО в буфер записывалось не первое слово до пробела,а все.Как только я не извращался с gets и scanf ничего не получилось.Си у нас недавно,объясняют хорошо,но практика бежит вперед лекций,поэтому очень расчитываю на Вашу помощь.Заранее огромное Спасибо.

P.s. Сама проблема находится в первом цикле в главной программы.

Код:
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <string.h>

#define MAX_GROB 20


struct Lehreren{
	char *FIO;
	char *Fachbereich;
	int   Arbeitsbelastung;

};




void LehrerenArray(Lehreren** Lehrer, unsigned groB){
	unsigned i;
	for (i = 0; i < groB; i++){
		free((*Lehrer)[i].FIO);
		free((*Lehrer)[i].Fachbereich);
	}
	free(*Lehrer);
}

void LehererListe(Lehreren* Lehreren){
	printf("{ФИО Преподавателя : \"%s\", Кафедра : \"%s\ Нарузка : \"%d\"}\n",
		Lehreren->FIO, Lehreren->Fachbereich, Lehreren->Arbeitsbelastung);
}

int main()
{
	SetConsoleOutputCP(1251);
	SetConsoleCP(1251);

	Lehreren *Lehrer = NULL;
	unsigned groB;
	char buffer[128];
	unsigned i;


	printf("Enter number of users: ");
	scanf("%d", &groB);

	groB = groB <= MAX_GROB ? groB : MAX_GROB;
	Lehrer = (Lehreren*)malloc(groB * sizeof(Lehreren));

    
	for (i = 0; i < groB; i++) {

		printf("user #%d\nname: ", i);
		//scanf("%127s", buffer);
		gets(buffer);


		Lehrer[i].Arbeitsbelastung = i;

		Lehrer[i].FIO = (char*)malloc(strlen(buffer) + 1);
		strcpy(Lehrer[i].FIO, buffer);

		printf("password: ");
		scanf("%127s", buffer);

		Lehrer[i].Fachbereich = (char*)malloc(strlen(buffer) + 1);
		strcpy(Lehrer[i].Fachbereich, buffer);
	}

	for (i = 0; i < groB; i++) {
		LehererListe(&Lehrer[i]);
	}

	LehrerenArray(&Lehrer, groB);
	getch();

	return 0;
}

Последний раз редактировалось Stilet; 30.03.2015 в 20:01.
Neostat вне форума Ответить с цитированием
Старый 30.03.2015, 20:31   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Насколько я помню можно в scanf поставить несколько параметров через пробел, тогда сканф считает верно :
Код:
char f[20],i[20],o[20];
if(scanf("%s %s %s\n",&f,&i,&o)==3){Считалось все};
Уточни в MSDN на всяк случай.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.03.2015, 20:59   #3
Neostat
Пользователь
 
Регистрация: 19.10.2014
Сообщений: 49
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Насколько я помню можно в scanf поставить несколько параметров через пробел, тогда сканф считает верно :
Код:
char f[20],i[20],o[20];
if(scanf("%s %s %s\n",&f,&i,&o)==3){Считалось все};
Уточни в MSDN на всяк случай.
спасибо,если ничего другого не придумаю,то воспользуюсь этим.
Neostat вне форума Ответить с цитированием
Старый 30.03.2015, 21:10   #4
Aleksander550
Форумчанин
 
Регистрация: 07.01.2014
Сообщений: 124
По умолчанию

Можно FIO заполнять посимвольно, через gethe()
http://www.programmersforum.ru/showthread.php?t=275305
#define TRUE FALSE //счастливой отладки
Aleksander550 вне форума Ответить с цитированием
Старый 31.03.2015, 05:11   #5
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,639
По умолчанию

Это особенность реализации компилятора. В потоке ввода остается символ перехода на новую строку, который отлавливает gets в качестве ввода. Причем оно так работает и в VC++ и в G++. Рекомендуется вызывать функцию getchar перед вызовом gets или функцию gets вызывать два раза подряд.

Тема рассматривалась уже неоднократно:
28.07.2008 Не работает функция gets()!!!
14.06.2011 Не работает gets() в С++ ( рекомендуют fgets юзать )
27.10.2010 Странное поведение gets (тут рекомендуют cin.clear() )
18.11.2011 http://www.programmersforum.ru/showthread.php?t=174201 (рекоменуют fflush перед gets )
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с vba (проблемы создания макросов) Leojse Microsoft Office Excel 4 26.12.2013 20:09
2 проблемы hvz- Win Api 7 03.12.2012 23:53
проблемы с Qt CodeNOT Qt и кроссплатформенное программирование С/С++ 3 27.03.2012 12:17
проблемы с IE Tradua HTML и CSS 1 05.08.2011 06:54
проблемы с IE xakzona Помощь студентам 1 16.12.2008 21:53