Функция, которая разделяет строку по пробелам. В массив добавляются лишние элементы - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Написал функцию, которая разделяет строку по пробелам (или какому-либо другому символу) и сохраняет эти разделённые слова в элементах массива. Проблема заключается в том, что если указана строка "1 2 3 4", то в массив добавляются еще 8 (в итоге 12 элементов) элементов, содержащие непонятные символы. Если вывести содержимое этих элементов, то ломаются шрифты и приходится восстанавливать их с помощью tail /bin/ls (не знаю почему). Но если указать строку "1 2 3 4 5 6 7 8 9 10", то в итоге в массиве опять же 12 элементов, но при выводе их содержимого шрифты не ломаются. Не могу понять, где находится проблема, но может вы сможете? code.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "explode.c" // explode()
 
int main() {
    char *string = "1 2 3 4 5 6 7 8 9 10";
    char *array[100];
    explode(string, array, ' ');
    print_array(array);
}
explode.c:
void explode(char *string, char *array[], char symbol) {
    char *ptr = string; // Указатель на строку
    char *tmp = (char *) malloc(sizeof(char) * 256); // Текущее слово (слова разделены символом symbol)
    int index = 0; // Индекс текущего элемента в массие array[]
 
    while(*ptr != '\0') { // Читаем до конца строки
 
        if(*ptr == symbol) { // Символ разделителя?
 
            array[index] = (char *) malloc(sizeof(char) * strlen(tmp) + 1); // Выделяем элементу область памяти
            strncpy(array[index], tmp, strlen(tmp)); // Копируем текущее слово в элемент массива
            strncat(array[index], "\0", 1); // Добавляем нулевой байт
 
            bzero(tmp, strlen(tmp)); // Заполняем tmp нулевыми байтами
            index++; // Для следующего слова - следующий элемент массива
        
        } else {
            strncat(tmp, ptr, 1); // Добавляем 1-ый символ ptr
        }
 
        ptr++;
    }
 
    // Последнее слово не добавлено в массив, так как в конце у нас нету символа symbol.
    // (Он может быть поставлен пользователем вручную (в строке string), но это неэффективно,
    // так как по задумке пользователь хотел добавить пустой элемент в массив, поэтому
    // добавляем последнее слово вручную.)
    array[index] = (char *) malloc(sizeof(char) * strlen(tmp) + 1); // Выделяем элементу область памяти
    strncpy(array[index], tmp, strlen(tmp)); // Копируем текущее слово в элемент массива
    strncat(array[index], "\0", 1); // Добавляем нулевой байт
 
}
 
/*
 * Вывести содержимое элементов массива.
 */
void print_array(char *array[]) {
    int index; // Индекс текущего элемента
    for(index = 0; array[index] != NULL; index++) {
        printf("#%d: %s\n", index, array[index]); // Выводим индекс и содержимое элемента
    }
}
Если кратко, то проблема кроется в непонятных элементах массива.

Решение задачи: «Функция, которая разделяет строку по пробелам. В массив добавляются лишние элементы»

textual
Листинг программы
char *test_ptr = tmp;
while(*test_ptr != '\0') 
{
    test_ptr++;
}

Объяснение кода листинга программы

  1. В данной строке кода переменная test_ptr указывает на символ в строке tmp.
  2. В цикле while выполняется проверка, не является ли текущий символ нулевым символом '\0'.
  3. Если текущий символ не является нулевым, то переменная test_ptr увеличивается на единицу, чтобы перейти к следующему символу в строке.
  4. Цикл while продолжается, пока не будет найден нулевой символ.
  5. После нахождения нулевого символа, переменная test_ptr будет указывать на следующий символ после него.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.9 из 5
Похожие ответы