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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2011, 01:19   #1
Алексей Денисов
Пользователь
 
Регистрация: 04.07.2011
Сообщений: 16
По умолчанию функция на Си: работает, но не понятно как

в небольшой учебной программке не до конца понятно как работает функция getWord(): ведь за один вызов она возвращает указатель на одно слово? но это слово - все маленькие латинские буквы во входном потоке, а функция за один вызов выдает только часть, например, где строка обрывается пробелом, цифрой или другим символом - не буквой латинского алфавита. а со следующим вызовом выдает следующую часть строки. например, если набрать "asd123dsa2www", программа напечатает
asd
dsa
www
кто нибудь, плиз, объясните, каким образом в pWord попадают "кусочки" строки. прошу прощения, если не очень понятно спросил. вот код:


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

struct node {
		int counter;
		struct node *left;
		struct node *right;
		char *nWord;
	};
	typedef struct node Node;

	char *getWord(void);
	/*Node *newNode(char *word);
	void addWord(Node *tree, char *word);
	void printTree(Node *tree);*/

	#define LEN_AR 400

int main()
{
	char *word = NULL;
	while(word = getWord())
		puts(word);
	return 0;

}

char *getWord(void)
{
	int len = 0;
	char word[LEN_AR];
	char *pWord;
	int c;
	
	while(1) {
		c = getchar();
		if(strchr("abcdefghijklmnopqrstuvwxyz", c) != NULL) {
			word[len++] = c;
			if(len >= LEN_AR - 1) {
				puts("\nслишком длинное слово");
				exit(1);
			}
			continue;
		}
		if(len == 0)
			if(c != EOF) continue;
			else return NULL;
		break;
	}
	word[len] = '\0';
	pWord = (char *) malloc(len + 1);
	strcpy(pWord, word);
	
	return pWord;
}
Алексей Денисов вне форума Ответить с цитированием
Старый 28.11.2011, 01:45   #2
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Во-первых, программа содержит ошибки. например, в ней происходит "утечка памяти", то есть выделяется память в динамической области памяти, но она не освобождается.

Теперь, что касается работы функции.

Алгоритм ее следующий. Она последовательно считывает символы входного потока. Проверяет, является ли символ латинской буквой. Если является, то сохраняет его в символьном окальном массиве. Если встретилась не буква латинского алфавита, то в программе выдяется память в динамической области памяти, туда копируется локальный символьный массив, и адрес выделенной памяти возвращается в вызывающую программу.
Ежели во входном потоке встретилась не буква латинского алфавита, то делается проверка по длине уже заполненной части локального массива, имеет ли он сохраненные символы? если имеет, то считается, что было считано слово. Ежели пока локальный массив пуст, продолжается чтение из символьного потока и все символы, которые не являются буквами латинского алфавита, пропускаются.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 28.11.2011, 03:02   #3
Алексей Денисов
Пользователь
 
Регистрация: 04.07.2011
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Сыроежка Посмотреть сообщение
Ежели во входном потоке встретилась не буква латинского алфавита, то делается проверка по длине уже заполненной части локального массива, имеет ли он сохраненные символы? если имеет, то считается, что было считано слово. Ежели пока локальный массив пуст, продолжается чтение из символьного потока и все символы, которые не являются буквами латинского алфавита, пропускаются.
Спасибо. но вот что интересно: а где именно в программе определяется читать следующее слово из потока, запомнив уже считанное? или точнее пропустив считанное? ведь если в main() вызвать getWord() единожды, она вернет только один кусок строки - до первого символа, не являющегося латинской буквой:
Код:
word = getWord();
puts(word);
Алексей Денисов вне форума Ответить с цитированием
Старый 28.11.2011, 09:15   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а где именно в программе определяется читать следующее слово из потока
А нигде Прога хитрозадая, она читает не слова а символы из потока.
Вызвал ты в цикле считку строки, ввел в строку символы, при каждом вводе символов прога анализирует - буква это или нет. Как только попадается введенная небуква getWord выходит из своего цикла, прокручивая операцию puts(word); - вывод считанного на экран. А поскольку она сама помещена в цикл :
Цитата:
while(word = getWord())
puts(word);
То после вывода на экран опять происходит ее вызов и она продолжает считывать посимвольно.
На экране создается эффект интерактивности, ибо программа на лету проводит анализ введенного.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.11.2011, 10:11   #5
Алексей Денисов
Пользователь
 
Регистрация: 04.07.2011
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
То после вывода на экран опять происходит ее вызов и она продолжает считывать посимвольно.
На экране создается эффект интерактивности, ибо программа на лету проводит анализ введенного.
прошу прощения за настойчивость: никак не пойму алгоритма этой хитрозадости - при новом вызове функция должна вроде бы сначала читать введенную строку? но этого не происходит.
Алексей Денисов вне форума Ответить с цитированием
Старый 29.11.2011, 01:29   #6
Алексей Денисов
Пользователь
 
Регистрация: 04.07.2011
Сообщений: 16
По умолчанию

к сожалению, я так и не разобрался с этой функцией ((
в смысле не получается ясно представить её работу. что ж, может, со временем...
Алексей Денисов вне форума Ответить с цитированием
Старый 29.11.2011, 10:29   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
при новом вызове функция должна вроде бы сначала читать введенную строку?
Чего это? При новом вызове функция не просто продолжает считывать ту же строку, а и напрочь забывает о предидущем считывании. В программе нигде не указано считывать с начала всего ввода.
Другое дело что функция при вызове думает что вводится новая строка, и начинает наполнять переменную word с начала.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.11.2011, 23:03   #8
Алексей Денисов
Пользователь
 
Регистрация: 04.07.2011
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
На экране создается эффект интерактивности, ибо программа на лету проводит анализ введенного.
но ведь пока не нажмешь enter на экран ничего не выводится. а после нажатия все слова латинскими буквами выводятся сразу. а может такое быть, что при каждом вызове
Код:
pWord = (char *) malloc(len + 1);
выделяются разные участки памяти и поскольку они не освобождаются free(), то при вызове в цикле функции getWord() <в main()> они вываливаются все, сколько накопилось?
Алексей Денисов вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не понятно по каким причинам не работает защита от дурака axell24 Помощь студентам 4 29.10.2011 08:18
Как работает префикс функция ? videolord Общие вопросы по Java, Java SE, Kotlin 4 15.04.2011 17:17
Не понятно как работает программа на рекурсию. Kroleg Помощь студентам 1 26.03.2011 18:06
Как работает функция number_format? Nikirinka PHP 4 08.01.2011 16:50
Объясните, как работает функция strlen() TheWanderer Общие вопросы C/C++ 9 25.11.2008 22:46