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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2016, 00:43   #1
CeHTuJI
Пользователь
 
Регистрация: 26.08.2013
Сообщений: 51
По умолчанию Выделение слов из строки

Есть алгоритм выделения слов из строки, разделенных n-ым количеством пробелов, строка считывается из файла по частям с помощью fgets, проблема заключается в том, что все работает,но только я немного меняю файл или количество символов, которое читает fgets - ловлю такую ошибку

ругается на данную строку
Код:
 strcat_s(stringArray[k], 30, slovo);
и выходит такая ситуация, что я меняю файл или кол-во символов в fgets и оно может работать, а может нет. Вот весь код выделения
Код:
while (fgets(s1, 80, fin))
	 {
		 i = 0;
		 while (i < strlen(s1)) {
			 while (i < strlen(s1) && s1[i] == ' ') i++;

			 if (i < strlen(s1)) {
				 i1 = i;
				 while (i < strlen(s1) && s1[i] != ' ') i++;

				 if (flag == 1) {
					 if (i1 == 0)
					 {
						 k--; flag = 0;
					 }
				 } else 
					 strcpy_s(stringArray[k], 30, "");

				 if (i == strlen(s1)) flag = 1;
				 n = i - i1;
				 strncpy_s(slovo, 30, &s1[i1], n);
				 slovo[n] = '\0';
				 strcat_s(stringArray[k], 30, slovo);
				 k++;
			 }
		 }
	 }
P.S если заменить данную строку с конкатенацией на strcpy, то ошибки нет, но тогда слова попадающие на конец буфера fgets разрезаются на 2 части, а мне нужно их склеивать

----
Одной из причин ошибок были переносы строк, их убрал, но все равно при небольшом буфере ошибка вылетает и опять на строку с конкатенацией, значения в отладчике посмотрел, и одна, и вторая строка содержат \0

Последний раз редактировалось CeHTuJI; 13.02.2016 в 01:24.
CeHTuJI вне форума Ответить с цитированием
Старый 13.02.2016, 09:58   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

а что такое stringArray мы должны догадаться сами?
Если слово станет длиннее, чем 30, будет ли ноль на конце stringArray[k] или нет?
А зачем нужно к? То его увеличиваем, то уменьшаем, непонятки.

Кстати, уберите этот strlen!
Вызовите его один раз в начале и присвойте переменной и потом используйте переменную.
waleri вне форума Ответить с цитированием
Старый 13.02.2016, 10:22   #3
CeHTuJI
Пользователь
 
Регистрация: 26.08.2013
Сообщений: 51
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
а что такое stringArray мы должны догадаться сами?
Если слово станет длиннее, чем 30, будет ли ноль на конце stringArray[k] или нет?
А зачем нужно к? То его увеличиваем, то уменьшаем, непонятки.

Кстати, уберите этот strlen!
Вызовите его один раз в начале и присвойте переменной и потом используйте переменную.
Слов длинее 30 символов нет. StingArray -массив , куда заносятся выделенные слова. Увеличиваем К когда выделяется новое слово, уменьшаем если fgets разрезает слово пополам (строка заканчивается без пробела и следующая начинается тоже без пробела)
CeHTuJI вне форума Ответить с цитированием
Старый 13.02.2016, 12:54   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

покажи входной файл.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 13.02.2016, 20:34   #5
CeHTuJI
Пользователь
 
Регистрация: 26.08.2013
Сообщений: 51
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
покажи входной файл.
http://vk.com/doc59101487_437268009
Сейчас fgets читает по 100 символов, все работает, но если ставлю 80, то не начинать выбивать
CeHTuJI вне форума Ответить с цитированием
Старый 13.02.2016, 20:42   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Как звучит оригинал задания?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 13.02.2016, 23:54   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

strtok нельзя использовать?
pu4koff вне форума Ответить с цитированием
Старый 14.02.2016, 14:45   #8
CeHTuJI
Пользователь
 
Регистрация: 26.08.2013
Сообщений: 51
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Как звучит оригинал задания?
Выделение слов из строки, строка может быть любого размеров и содержит переносы.
CeHTuJI вне форума Ответить с цитированием
Старый 14.02.2016, 14:46   #9
CeHTuJI
Пользователь
 
Регистрация: 26.08.2013
Сообщений: 51
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
strtok нельзя использовать?
Желательно не использовать
CeHTuJI вне форума Ответить с цитированием
Старый 14.02.2016, 15:02   #10
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Выделение слов из строки
Что здесть означают понятия "выделение" и "слово"?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
выделение из строки s, m слов, начиная от слова номер n. Lers Общие вопросы C/C++ 2 01.05.2013 22:33
ТурбоПаскаль. Выделение чисел из слов. eduard.80@mail.ru Помощь студентам 5 14.12.2011 18:21
RichEdit - Выделение цветом слов fakir9999 Помощь студентам 11 29.05.2009 09:30
Выделение слов цветом в Memo Костян Пират Общие вопросы Delphi 9 05.03.2009 08:52
Выделение слов из строки // Pascal Rifler Паскаль, Turbo Pascal, PascalABC.NET 4 02.07.2008 08:22