Функция, которая разделяет строку по пробелам. В массив добавляются лишние элементы - 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будет указывать на следующий символ после него.