powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопросы начинающего - функции для работы со строковыми лексемами
25 сообщений из 73, страница 2 из 3
Вопросы начинающего - функции для работы со строковыми лексемами
    #38956276
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey VahromkinЧто теперь скажете?
Что ты так и не прочитал принципы работы strtok по ссылке, приведённой выше.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38956289
Andrey Vahromkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovAndrey VahromkinЧто теперь скажете?
Что ты так и не прочитал принципы работы strtok по ссылке, приведённой выше.

Уважаемый, я неоднократно читал описание данной функции и по вашей ссылке, и в других источниках.
Возможно, я что-то не понял из прочитанного, но нам обоим было бы проще, если бы вы (раз уж находите время мне отвечать) отвечали бы несколько более развернуто.
В чем именно состоит моя ошибка?
...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38956380
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey VahromkinВ чем именно состоит моя ошибка?
В том, что Вы сделали алгоритм сложности O(N^2) вместо O(N). От утечек памяти Вы, конечно,
избавились, но использование strncpy преподнесёт вам очень неприятный сюрприз если входная
строка окажется длиннее буфера. На этом фоне пара избыточных проверок и копирований
туда-сюда уже сущие мелочи.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38956407
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вархомкин. Strtok - это statefull функция. Конечный автомат по сути. А ты с ней пытаешся работать как со stateless.
В этом твой неверный подход. А всё остальное - это уже "сопуствующие мелочи".
...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38956415
Andrey Vahromkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovВ том, что Вы сделали алгоритм сложности O(N^2) вместо O(N). От утечек памяти Вы, конечно,
избавились, но использование strncpy преподнесёт вам очень неприятный сюрприз если входная
строка окажется длиннее буфера.
Ну strncpy я поначалу действительно принял за "безопасную" версию strcpy, однако позже узнал, что её следует либо заменить на strlcpy, либо использовать в сочетании с дополнительными проверками на нуль-терминирование копируемой строки. Однако в рамках данного вопроса не посчитал нужным что-то пока менять в этом направлении. Коварные особенности этой функции, тем не менее, держу в уме.
Dimitry SibiryakovНа этом фоне пара избыточных проверок и копирований туда-сюда уже сущие мелочи.
К сожалению, пока не понимаю, что именно избыточно... пока сам ищу и думаю...
maytonВархомкин.
Вахромкин :)
maytonStrtok - это statefull функция. Конечный автомат по сути. А ты с ней пытаешся работать как со stateless.
В этом твой неверный подход. А всё остальное - это уже "сопуствующие мелочи".
Будьте снисходительны, я с Си познакомился неделю назад от силы.
Можно то же самое, но по-русски?
...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38956418
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey VahromkinЧто теперь скажете?
Так работать будет, но медленно.
Andrey Vahromkin1. Внутри функции объявим массив символов char s[STR_BUFFER], и туда будем копировать разбираемую строку.
Это будет массив локальный, под него память будет выделена статически, и после выхода из функции эта память будет освобождена автоматом (в принципе, как я понимаю, тут можно и malloc/calloc использовать, главное потом перед выходом из функции не забыть про free - правильно?)
Сейчас правильно. Указатель на освобожденную память отсутствует, т.к. место ты выделил в main() (word = ...), выше косяк был именно в этом.
malloc/free тут тоже можно, но char s[STR_BUFFER] отработает быстрее.

Код уже рабочий, но наихудший по все параметрам. Все тормоза тут из-за копирования строки. Зачем? Она уже в памяти. Ищи разделитель и копируй в word только нужный кусок.

Еще в коде отсутствует проверка размеров буферов, т.е. если строка или слово будет более STR_BUFFER-1 символов, то вылезешь за пределы массивов. Это уже потенциальный косяк.

Если пишешь в целях самообучения указателям, то зачем использовать функции str...() ? Достаточно только указателей. Поизучай этот код.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
// Получение первого слова
// параметры: буфер для сохранения результата, размер буфера, исходная строка, символ разделитель
// возвращает указатель на разделитель после слова
const char* firstword(char *word, const int size, const char *str, char delim)
{
	char* end = word + size - 1; // указатель на последний элемент буфера
	while(*str != 0 && *str == delim) str++; // пропуск разделителей в начале строки
	// копирование первого слова
	while(word < end && *str != 0 && *str != delim) {
		*word = *str;
		word++;
		str++;
	}
	*word = 0;
	return str;
}

int main()
{
	char s[] = "  Hello, my   crazy world! ";
	char word[STR_BUFFER];
	const char* p = s;
	int i = 0;
	while(true) {
		p = firstword(word, STR_BUFFER, p, ' ');
		if(*word == 0) break;
		i++;
		printf("%d. '%s'\n", i, word);
	};

	system("pause");
	return 0;
}

...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38956425
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey VahromkinЧто теперь скажете?

1) Вернуть strdup/free, т.к. в стеке выделять произвольные буферы не принято, особенно когда в реальном приложении буфер понадобится большим, и особенно не проверяя его размер при копировании.

2) Этот if лишний, т.к. перекрывается условием while
Код: plaintext
1.
2.
  if (n != 1) 
    while ( i <= n && p != NULL ) 



Остальное все - ок. Ф-я strtok используется верно, не знаю что mayton'у не нравится.
...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38956429
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВсе тормоза тут из-за копирования строки. Зачем? Она уже в памяти. Ищи разделитель и копируй в word только нужный кусок.
Потому что strtok модифицирует строку в которой ищет.
Если делать без strtok то можно не копировать.
...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38956431
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey VahromkinБудьте снисходительны, я с Си познакомился неделю назад от силы.
Можно то же самое, но по-русски?
Советую взять какую-нибудь книгу по Си и почитать хотя бы про указатели, а лучше целиком.
Указатели тема не простая, но фундаментальная для Си, полностью тут никто расписывать не будет (много букав будет и уже расписано в книгах), а по обрывкам тяжело изучать. Лучше почитай, а что не поймешь - тут спроси.
...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38956438
Andrey Vahromkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, всем большое спасибо за терпение и ответы, беру небольшой таймаут на изучение всего написанного.
...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38956450
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey VahromkinБудьте снисходительны, я с Си познакомился неделю назад от силы.
Можно то же самое, но по-русски?
Зачем я должен быть снисходителен. Ты пишешь - "...на старости лет...". Это что?
Ты старый разработчик. Возможно ты - старше меня. И зачем я должен быть снисходителен?
Зачем нужно тебя жалеть и нянчить? Я описал проблему в "общих" терминах. Не на сях а "вообще". Функция strtok
имеет протокол или порядок работы. 1) модификация строки. 2) получение итератора на подстроки
разбитые сплиттером. 3) Работа с ними и освобождение памяти.

Твой код можно записать в 5-7 строчек и хватит. Не нужны там никакие чудовищные extractword4.

Впрочем тебе уже Анатолий это рассказывает.
...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38956459
Andrey Vahromkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, всем большое спасибо за терпение и ответы, беру небольшой таймаут на изучение всего написанного.
...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38956477
YesSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FYI
одна из имплементаций strtok. Раз уж так много постов уделено этой функции
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
/* Copyright (C) 1991,1996,1997,1999,2000,2001,2007
   Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, write to the Free
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307 USA.  */

#include <string.h>


static char *olds;

#undef strtok

/* Parse S into tokens separated by characters in DELIM.
   If S is NULL, the last string strtok() was called with is
   used.  For example:
	char s[] = "-abc-=-def";
	x = strtok(s, "-");		// x = "abc"
	x = strtok(NULL, "-=");		// x = "def"
	x = strtok(NULL, "=");		// x = NULL
		// s = "abc\0=-def\0"
*/
char *
strtok (s, delim)
     char *s;
     const char *delim;
{
  char *token;

  if (s == NULL)
    s = olds;

  /* Scan leading delimiters.  */
  s += strspn (s, delim);
  if (*s == '\0')
    {
      olds = s;
      return NULL;
    }

  /* Find the end of the token.  */
  token = s;
  s = strpbrk (token, delim);
  if (s == NULL)
    /* This token finishes the string.  */
    olds = __rawmemchr (token, '\0');
  else
    {
      /* Terminate the token and make OLDS point past it.  */
      *s = '\0';
      olds = s + 1;
    }
  return token;
}


...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38956482
Andrey Vahromkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonAndrey VahromkinБудьте снисходительны, я с Си познакомился неделю назад от силы.
Можно то же самое, но по-русски?
Зачем я должен быть снисходителен. Ты пишешь - "...на старости лет...". Это что?
Это было вступлением к беседе. Вычеркните, если вас оно раздражает.
maytonТы старый разработчик. Возможно ты - старше меня. И зачем я должен быть снисходителен?
Зачем нужно тебя жалеть и нянчить?
Мне бы не хотелось вступать в дискуссии, не имеющие отношения к вопросу, но так, на всякий случай - поинтересуйтесь значениями слова "снисхождение". С жалостью там ничего общего нет. "Нянчить" меня вы действительно не обязаны, но раз уж решили ответить на вопрос "чайника", будьте добры использовать минимум жаргонизмов и терминов на иностранных языках, отвечайте так, чтобы вас можно было понять.

maytonТвой код можно записать в 5-7 строчек и хватит. Не нужны там никакие чудовищные extractword4.
Тело моей функции состоит из 11 строк.
После спокойного ознакомления с написанным вами и остальными, думается, уложусь и в озвученные вами 5-7.
4 лишние строки делают функцию "чудовищной"?
...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38956505
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey Vahromkin4 лишние строки делают функцию "чудовищной"?
Производительность тут теряется на бесполезных итерациях. Указатели это не просто другой синтаксис, по сравнению с другими ЯП, это совсем другие возможности, но сначала надо суть понять, чтобы эти возможности задействовать. Поэтому читай книжку.
Мой пример выше поизучай 17628531
Можешь еще парсер строки CSV посмотреть, тоже близкая тема 17389367
...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38956532
Andrey Vahromkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TПроизводительность тут теряется на бесполезных итерациях. Указатели это не просто другой синтаксис, по сравнению с другими ЯП, это совсем другие возможности, но сначала надо суть понять, чтобы эти возможности задействовать. Поэтому читай книжку.
Спасибо. Я сейчас читаю Кернигана и Ритчи, параллельно вот пытаюсь практиковаться.
Dima TМой пример выше поизучай 17628531
Можешь еще парсер строки CSV посмотреть, тоже близкая тема 17389367
Большое спасибо. Ваш пример, как я понял, иллюстрирует разбиение на лексемы без использования strtok.
Я, собственно, с этого и начал (естественно, моя функция из первого поста нуждается в кардинальной переработке), но как-то обсуждение перетекло на вариант с strtok...
Буду разбираться дальше, еще раз большое спасибо вам и остальным.
...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38956547
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey VahromkinТело моей функции состоит из 11 строк.
После спокойного ознакомления с написанным вами и остальными, думается, уложусь и в озвученные вами 5-7.
4 лишние строки делают функцию "чудовищной"?
Твой код не пройдёт "code-review" с точки зрения обычного "C"-шного кода.
Мотиваций для introduce new function я не вижу никакой. Про избыточные вычисления
и временнУю сложность алгоритма Дмитрий уже писал. Я просто присоединяюсь.
...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38956557
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey Vahromkin,
непонятно в чём у вас проблема. Вообще говоря, у K&R есть разбор вашей задачи. Вы хотите сделать всё "нахрапом" и побыстрее и учесть все детали, так не бывает. Язык Си требует тщательного изучения.
1. Комментарии это безусловно хорошо и полезно, но участниками этого Сообщества являются не школьники 5 класса, а достаточно грамотные люди. Лично мне (хотя я знаю тут явно менее других товарищей) не нравится читать такой код где прокомментирована каждая строчка. Думаю остальные также обратили на это внимание и солидарны по этому вопросу. Комментируйте только основные и неоднозначные моменты.
2. Почему вы используете calloc ? Принципиальна инициализация в 0 ?
3. Неудачное именование параметров функции и других объектов программы
...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38956804
Andrey Vahromkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonТвой код не пройдёт "code-review" с точки зрения обычного "C"-шного кода.
Мотиваций для introduce new function я не вижу никакой. Про избыточные вычисления
и временнУю сложность алгоритма Дмитрий уже писал. Я просто присоединяюсь.
Это мой первый код на Си - и вы хотите, чтобы он был образцовым? В таком случае у меня бы не было необходимости сюда писать...
Я внимательно читаю все, что мне пишут, стараюсь делать выводы и исправлять ошибки.
За участие и помощь я вам и остальным очень благодарен.
SashaMercuryAndrey Vahromkin,
непонятно в чём у вас проблема. Вообще говоря, у K&R есть разбор вашей задачи. Вы хотите сделать всё "нахрапом" и побыстрее и учесть все детали, так не бывает. Язык Си требует тщательного изучения.
Я, конечно, могу объяснить, зачем мне все это нужно, но только я и сам прекрасно понимаю, что предстоит еще очень много узнать, поэтому никуда не спешу, а разбираюсь в основах.
SashaMercury1. Комментарии это безусловно хорошо и полезно, но участниками этого Сообщества являются не школьники 5 класса, а достаточно грамотные люди. Лично мне (хотя я знаю тут явно менее других товарищей) не нравится читать такой код где прокомментирована каждая строчка. Думаю остальные также обратили на это внимание и солидарны по этому вопросу. Комментируйте только основные и неоднозначные моменты.
Учту, спасибо.
SashaMercury2. Почему вы используете calloc ? Принципиальна инициализация в 0 ?
Вы выше спрашивали, в чем у меня проблема...С моей точки зрения мир сейчас выглядит так:
1. В языке Си для выполнения любой одной конкретной элементарной задачи существует несколько решающих эту задачу функций, причем 90% этих функций использовать нежелательно, а остальные 10% содержат те или иные ошибки и использовать их тоже не стоит.
2. Писать собственные реализации вышеозначенных функций также не рекомендуется, поскольку есть стандартные функции, а то, что удастся написать, будет заведомо хуже.
3. Если компиляция программы на паскале либо запуск perl-скрипта прошли без ошибок и предупреждений, а программа выдает ожидаемые результаты - скорее всего, программа работает верно.
Если компиляция программы на Си прошла без ошибок и программа выдает верные результаты - это абсолютно ни о чем не говорит.
4. Решение классической задачи "прострелить себе ногу" на Си вовсе не "вы простреливаете себе ногу", а что-то вроде "Вы думаете, что прострелили себе ногу, но в итоге выясняется, что вы не выстрелили, не себе, и не в ногу".

Так почему же я использую calloc? Да просто пока по неопытности я из двух зол выбираю оба.

Вот какие-то такие у меня проблемы. Извините моего внутреннего Петросяна.

SashaMercury3. Неудачное именование параметров функции и других объектов программы
[молча развожу руками] На это мне абсолютно нечего сказать...
...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38956811
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саш а ты заметил что ты стал сурово гнобить и обижать новичков?
Do you remember как ты сам был зелёным нубасиком.
А щас - "забурел" и даёшь джунам советы как жить
...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38956851
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey VahromkinЯ, конечно, могу объяснить, зачем мне все это нужно, но только я и сам прекрасно понимаю, что предстоит еще очень много узнать, поэтому никуда не спешу, а разбираюсь в основах.
Это неинтересно. Граблей будет еще много по дороге будет, главное не расслабляйся.

2 SashaMercury
mayton прав. Нечего сказать по существу - промолчи. Тут есть гуру, которые любят погнобить спрашивающих, но в их словах есть крупицы полезных знаний. В твоих - нет. Не бери с них пример.
...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38956944
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T

mayton прав. Нечего сказать по существу - промолчи. Тут есть гуру, которые любят погнобить спрашивающих, но в их словах есть крупицы полезных знаний. В твоих - нет. Не бери с них пример.


Я прокомментировал код автора топика. Подсказал ему что K&R есть разобранный пример.
Сделал три вполне адекватных комментария по ему вопросу. Вы говорите чётко и ясно что мои советы бесполезны. Потому прошу вас по возможности прокомментировать каждый из трёх замечаний, и объяснить почему в каждом конкретном нет крупицы полезных знаний :) И да, "гнобить" никто никого не имеет право. В Сообществе это недопустимо.

PS
Марк, я прекрасно всё помню, у меня даже записано в блокноте, если я вдруг забуду. И это прокомментировал
SS Лично мне (хотя я знаю тут явно менее других товарищей). Вы меня второй раз обвиняете в грубости к новичкам, хотя я очень вежливо, всё объяснил. Марк, убеждаю вас ещё раз, никаких помыслов в грубости у меня не было, единственное что может смущать это сухой язык, но я привык так говорить с незнакомыми людьми.
...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38956975
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury1. Комментарии это безусловно хорошо и полезно, но участниками этого Сообщества являются не школьники 5 класса, а достаточно грамотные люди. Лично мне (хотя я знаю тут явно менее других товарищей) не нравится читать такой код где прокомментирована каждая строчка. Думаю остальные также обратили на это внимание и солидарны по этому вопросу. Комментируйте только основные и неоднозначные моменты.
Для автора они пока все основные и непонятные. Он честно в этом сознался:
Andrey VahromkinБуду пояснять, что именно я делаю, так будет виднее, понял ли я суть или нет.

SashaMercury2. Почему вы используете calloc ? Принципиальна инициализация в 0 ?
Нехорошо вопросом на вопрос отвечать. Именно про это писал. Считаешь что это лишнее - предложи свой вариант, а не отправляй на поиски альтернатив.
По-хорошему, в данном случае динамическое выделение памяти вообще не нужно. Это отдельная тема, и изучать ее надо отдельно.

SashaMercury3. Неудачное именование параметров функции и других объектов программы
Лично у меня тут претензий нет.
...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38957029
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSashaMercury1. Комментарии это безусловно хорошо и полезно, но участниками этого Сообщества являются не школьники 5 класса, а достаточно грамотные люди. Лично мне (хотя я знаю тут явно менее других товарищей) не нравится читать такой код где прокомментирована каждая строчка. Думаю остальные также обратили на это внимание и солидарны по этому вопросу. Комментируйте только основные и неоднозначные моменты.
Для автора они пока все основные и непонятные. Он честно в этом сознался:
Andrey VahromkinБуду пояснять, что именно я делаю, так будет виднее, понял ли я суть или нет.

SashaMercury2. Почему вы используете calloc ? Принципиальна инициализация в 0 ?
Нехорошо вопросом на вопрос отвечать. Именно про это писал. Считаешь что это лишнее - предложи свой вариант, а не отправляй на поиски альтернатив.
По-хорошему, в данном случае динамическое выделение памяти вообще не нужно. Это отдельная тема, и изучать ее надо отдельно.

SashaMercury3. Неудачное именование параметров функции и других объектов программы
Лично у меня тут претензий нет.

1. Таким образом мы дойдём до комментариев
Код: plaintext
1.
int a;//переменная целого типа ...



2. Так сначала изучите функции аллоцирования, а потом используйте. Язык Си это не лопата, бери кто угодно и копай. Может быть он специально использовал calloc, я не знаю, потому и спросил. В итоге оказалось что эта функция тут совершенно не нужна.
3. extractword и worddelim хорошие имена ?
...
Рейтинг: 0 / 0
Вопросы начинающего - функции для работы со строковыми лексемами
    #38957263
Andrey Vahromkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SashaMercury1. Таким образом мы дойдём до комментариев
Код: plaintext
1.
int a;//переменная целого типа ...



А другой стороны - почему бы не сэкономить свое и чужое время, максимально подробно поясняя свои действия в ходе обучения?
SashaMercury2. Так сначала изучите функции аллоцирования, а потом используйте. Язык Си это не лопата, бери кто угодно и копай. Может быть он специально использовал calloc, я не знаю, потому и спросил. В итоге оказалось что эта функция тут совершенно не нужна.
Хорошо, я поясню ход своих мыслей.
Функции malloc и calloc
Функция malloc() возвращает указатель на первый байт области памяти размером size, которая была выделена из динамически распределяемой области памяти. Если для удовлетворения запроса в динамически распределяемой области памяти нет достаточного объема памяти, возвращается нулевой указатель.

Функция calloc() выделяет память, размер которой равен значению выражения num * size, т.е. память, достаточную для размещения массива, содержащего num объектов размером size. Возвращает указатель на первый байт выделенной области памяти. Все биты распределенной памяти инициализируются нулями. Если для удовлетворения запроса нет достаточного объема памяти, возвращается нулевой указатель.

Как я полагаю, исходя из вышепроцитированного, в рассматриваемом примере нет особой разницы - использовать malloc или calloc.
Первая будет быстрее, вторая позволит закрыть глаза на возможное отсутствие '\0' и мусора в размещаемой в памяти строки - закрывать глаза, наверное, не есть хорошо, но все же может оказаться полезным.
По поводу "быстрее" - лично я сомневаюсь, что malloc тут даст какой-то существенный прирост в производительности, с другой стороны - возможно, в Си иные критерии существенности.
Было бы неплохо, если бы теперь вы пояснили, почему с вашей точки зрения calloc тут неоправдан, и что бы вы использовали вместо него.
SashaMercury3. extractword и worddelim хорошие имена ?
extract ion word - "извлечение слова"
word delim eters - "разделители слов"
Можно также функцию назвать " get_word ", а переменную - " separators ", но я сомневаюсь, что текст программы после этого станет гораздо понятнее. Предложите свои варианты, ради интереса.

Господа, я ещё раз переписал свои extractword'ы, в обоих вариантах - с strtok и без.
1. Вариант с strtok.
Короче он не стал, т.к. я постарался учесть замечания относительно каверз str(n)cpy а также добавил различные коды возврата для контроля за проиходящим внутри функции (0 - нет ошибок, 1 - нет слова с нужным номером, 2 и 3 - ошибки при внутреннем копировании строк)
Вместо массива s[STR_BUFFER] в качестве упражнения снова использую strdup/free ( 17628569 от Anatoly Moskovsky) - как я понял, единого мнения о лучшем способе создания копии нет.
Относительно strlcpy - пишу под freebsd, функция доступна в системе, вопросами переносимости кода на другие платформы пока не озабочивалсялся, но исходный код данной функции доступен и при необходимости может быть включен в тело программы.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
int extractword4(char *word, const unsigned int n, const char *str, const char *worddelim)
{
  int i = 2;
  char *s, *p;
  int result = 0;

  *word = '\0';
  s = strdup(str);

  if (s != NULL)
  {
    p = strtok(s, worddelim);
    while ( i <= n && p != NULL )
    {
      p = strtok(NULL, worddelim);
      i++;
    }
    if ( p != NULL) { if ( strlcpy(word, p, STR_BUFFER) >= STR_BUFFER ) result = 2; }
    else result = 1;
    free(s);
  }
  else result = 3;

  return result;
}


2. Вариант без strtok как советовал в ( 17628531 Dima T)
Короче чем с strtok, но что-то мне в нем не нравится, сейчас думаю, можно ли упростить.
Можно реализовать и без функций str..., тогда потребуется усложнять условия в циклах для отсева всех оговоренных разделителей, либо писать еще одну функцию, которая будет предварительно выполнять замену символов, входящих в набор разделителей каким-то одним символом
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
int extractword(char *word, const unsigned int n, const char *str, const char *worddelim)
{
  int count = 1;

  *word = '\0';
  while ( *str != 0 && strchr(worddelim, *str) != NULL ) str++; // вычистим разделители в начале строки
  while ( count != n )
  {
    if ( *str == '\0' ) return 1; // конец строки, а слово n не встретилось 
    while ( *str != 0 && strchr(worddelim, *str) == NULL ) str++;
    while ( *str != 0 && strchr(worddelim, *str) != NULL ) str++;
    count ++;
  }
  while ( *str != 0 && strchr(worddelim, *str) == NULL ) { *word = *str; word++; str++; }
  *word = '\0';

  return 0;
}
...
Рейтинг: 0 / 0
25 сообщений из 73, страница 2 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопросы начинающего - функции для работы со строковыми лексемами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]