BuckvicK
@BuckvicK
Опытный ламер

Как вернуть указатель в начало?

Имеется такой код.
text - это текст состоящий из слов, которые разделены разделителями
separator - массив разделителей
num_str количество строк.

bool checkString(char **text, char *separator, int num_str){
	int j = 0;
	for (int i = 0; i < 1; i++, j = 0){
		char *word = (char*)malloc(sizeof(char));
		while (text[i][j] != '\0'){
			if (!(strchr(separator, text[i][j]) != NULL) && !(text[i][j] == '\0')){
				word = (char*)realloc(word, (j + 1) * sizeof(char));
				word[j] = text[i][j];
				
			}
			else{
				word[j] = '\0';
				puts(word);
				word = NULL;
			}
			j++;
		}
	}
	return true;
}

Функция должна находить слова и выводить их в консоль, аналог strtok, но она первое слово определяет нормально, а остальные начинает записывать в память не с первой позиции, а с некоторой N - ой позиции, N = Длина_первого_слова + количество_разделителей. То есть, если есть строка:
Mama.Papa,Brat
В памяти будет выглядеть первое слово так:
"Mama"
Второе получится так:
"hhhhhPapa"
Где "hhhhh" это просто что то в памяти, как сделать что бы записывалось в первый символ?
  • Вопрос задан
  • 1660 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Жуть. Три года расстрела через повешение за такой код. realloc на каждый символ, обнуление указателя без освобождения памяти, постоянное индексное обращение при переборе строки - кол с минусом.

А ошибка очень простая - запись символа производится в word[j], соответственно на втором слове j начинается не с нуля. Вам ещё повезло, что программа не пытается записать символы поверх кода или в чужую область.

bool checkString(char **text, char *separator, int num_str) {
  char *str, *cur, *word;
  int len;
    for (int i = 0; i < num_str; i++, text++) {    
        str = cur = *text;
        while (*cur) {
            if (strchr(separator, *cur)) {
                len = cur-str;
                word = malloc(len+1);
                strncpy(word, str, len);
                puts(word);
                free(word);
                str = cur;
            }
            cur++;
        }
        puts(str);
    }
    return true;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
CTRL+ Москва
от 250 000 до 320 000 ₽
CTRL+ Москва
от 200 000 до 300 000 ₽
CTRL+ Белград
от 250 000 до 320 000 ₽
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект
21 нояб. 2024, в 22:21
3000 руб./в час