Функция, которая разделяет строку по пробелам. В массив добавляются лишние элементы - C (СИ)
Формулировка задачи:
Здравствуйте. Написал функцию, которая разделяет строку по пробелам (или какому-либо другому символу) и сохраняет эти разделённые слова в элементах массива. Проблема заключается в том, что если указана строка "1 2 3 4", то в массив добавляются еще 8 (в итоге 12 элементов) элементов, содержащие непонятные символы. Если вывести содержимое этих элементов, то ломаются шрифты и приходится восстанавливать их с помощью tail /bin/ls (не знаю почему). Но если указать строку "1 2 3 4 5 6 7 8 9 10", то в итоге в массиве опять же 12 элементов, но при выводе их содержимого шрифты не ломаются. Не могу понять, где находится проблема, но может вы сможете?
code.c
explode.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); }
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++; }
Объяснение кода листинга программы
- В данной строке кода переменная
test_ptr
указывает на символ в строкеtmp
. - В цикле while выполняется проверка, не является ли текущий символ нулевым символом '\0'.
- Если текущий символ не является нулевым, то переменная
test_ptr
увеличивается на единицу, чтобы перейти к следующему символу в строке. - Цикл while продолжается, пока не будет найден нулевой символ.
- После нахождения нулевого символа, переменная
test_ptr
будет указывать на следующий символ после него.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д