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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.01.2013, 20:20   #1
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию проблема с gets()

Привет! Почему gets(digit) инициализируется сама по себе, т.е без участия пользователя???
Код:
cout << "Enter amount of digits: ";
	cin >> N;
	for (i=0, k=0; i<N;) {
		gets(digit);
		puts(digit);
		if (IntegerCheck(digit)==1) {
			stream[k]=atoi(digit);
			k++;
			i++;
		}
		else cout << "Wrong. Re-enter: ";
	}
Igor95 вне форума Ответить с цитированием
Старый 13.01.2013, 20:37   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

во входном потоке остался код enter.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.01.2013, 20:41   #3
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

а что нужно сделать чтоб его убрать оттуда?
инициализировать digit[] как NULL?
Igor95 вне форума Ответить с цитированием
Старый 13.01.2013, 20:42   #4
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

fflush(stdin);
EUGY вне форума Ответить с цитированием
Старый 13.01.2013, 20:46   #5
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

отлично, спасибо огромное)
теперь работает как следует))
тогда последний вопрос: что лучше использовать fgets() или gets()?
Igor95 вне форума Ответить с цитированием
Старый 13.01.2013, 20:51   #6
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
что лучше использовать fgets() или gets()?
Лучше для чего?

gets возвращает линию, fgets строку.
линия заканчивается символом \n, строка - символом \0
EUGY вне форума Ответить с цитированием
Старый 13.01.2013, 21:30   #7
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

с этим ясно, но возникла еще одна проблема...((
Код:
void main() {
	cout << "File address: ";
	fgets(filename, sizeof(filename), stdin);
	file=fopen(filename, "w+b");
	cout << "Enter amount of digits: ";
	cin >> N;
	fflush(stdin);
	for (i=0; i<N;) {
		fgets(digit, sizeof(digit), stdin);
		puts(digit);
		if (IntegerCheck(digit)==1) {
			stream[i]=atoi(digit);
			cout << "stream[" << i << "]: " << stream[i] << "\n";
			i++;
			fflush(stdin);
		}
		else cout << "Wrong. Re-enter: ";
	}
	fwrite(stream, sizeof(int), N, file);
	fseek(file, 1, 0);
	fread(pReturndigit, sizeof(int), 1, file);
	cout << "returndigit (must be -1): " << returndigit << "\n";
	fclose(file);
	system("pause");
	}
выдает, что в строке 77 в fwrite.c (stream!=NULL)... почему?

Последний раз редактировалось Igor95; 13.01.2013 в 21:33.
Igor95 вне форума Ответить с цитированием
Старый 13.01.2013, 21:43   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,372
По умолчанию

Функцию gets() не следует использовать ни прикаких обстоятельствах!
Нельзя указать размер буфера и в результате возможно переполнение и сбой программы а то и что похуже...
waleri вне форума Ответить с цитированием
Старый 13.01.2013, 21:43   #9
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

так, получается, что я открыл не существуюший файл что-ли?
Igor95 вне форума Ответить с цитированием
Старый 13.01.2013, 21:45   #10
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
в stream[i] постоянно записывается двойка... почему?
Трудно сказать без пошаговой отладки, глядя на отрывок кода.
Сразу смущает sizeof(digit) - Из-за разных способов декларирования digit могут быть разные значения.
Код:
char *digit = new char[10];
char digit[10];
И неизвестная функция IntegerCheck. Что внутри себя она проделывает с параметром можно только гадать.
EUGY вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Неблокирующий сокет Си проблема с закрытием, проблема с закрытием сокетов в цикле mnx_vol C/C++ Сетевое программирование 0 06.11.2012 13:57
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37