Преобразование строки в вектор - C (СИ)
Формулировка задачи:
необходимо преобразовать строку в вектор, разбивая строку на элементы всякий раз, когда встречается символ sep.
например
строка "SHELL=/bin/bash:usr=monty:PWD=/bin/monty:LANG=en_US.UTF-8"
сивмол sep=':'
тогда вектор "SHELL=/bin/bash’\0’usr=monty’\0’PWD=/bin/monty’\0’LANG=en_US.UTF-8’\0"
у меня
нарушение прав доступа при записи по адресу 0xCCCCCCCC.
подскажите, пожалуйста, что не так
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { char const *string = "SHELLj:-8"; char **argz; int *argz_len=0; int len=strlen(string),i; char sep=':'; *argz = (char) calloc(len, sizeof(char)); for (i=0; i<len; i++) { if (string[i]==(char)sep) (*argz)[i]='\0'; else (*argz)[i]=string[i]; } *argz_len=len; printf("%d\n",argz_len); return 0; }
Решение задачи: «Преобразование строки в вектор»
textual
Листинг программы
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { char const *string = "SHELL=/bin/bash:usr=monty:PWD=/bin/monty:LANG=en_US.UTF-8"; int len = strlen(string), i, j = 0, k = 0; char **result = (char**)calloc(20, sizeof(char*)); char sep = ':'; for (i = 0; i < len; i++) { if(string[i] == sep) { if(i - j) { result[k] = (char*)calloc(i - j + 1, sizeof(char)); strncpy(result[k], &string[j], i - j); j = i + 1; k++; } else { j = i + 1; } } } result[k] = (char*)calloc(len - j + 1, sizeof(char)); strncpy(result[k], &string[j], len - j); k++; for(i = 0; i < k; i++) { printf("%s\n", result[i]); } getchar(); return 0; }
Объяснение кода листинга программы
- Объявлены основные переменные:
string
- указатель на строку, которую необходимо разбить на подстроки. Значение строки -SHELL=/bin/bash:usr=monty:PWD=/bin/monty:LANG=en_US.UTF-8
.len
- длина строки.i
,j
,k
- индексы для обработки строки.result
- указатель на массив указателей на строки, который будет хранить результат разбиения.sep
- разделитель строк.
- В цикле
for
происходит обработка каждого символа строки:- Если текущий символ равен разделителю, то выполняется следующее действие:
- Если длина текущей подстроки меньше, чем максимальная длина подстрок в массиве
result
, то:- Выделяется память под новую строку.
- Строка копируется в новую строку.
- Устанавливается новый индекс для начала следующей подстроки.
- Если длина текущей подстроки равна максимальной длине подстрок в массиве
result
, то устанавливается новый индекс для начала следующей подстроки. - Если длина текущей подстроки больше максимальной длины подстрок в массиве
result
, то выделяется память под новую строку и копируется в нее текущая подстрока.
- После обработки всех символов строки, выводится результат:
- В цикле
for
перебираются все строки в массивеresult
. - Для каждой строки выводится ее значение.
- В цикле
- В конце программы запрашивается ввод символа для подтверждения выполнения программы.
- Программа возвращает 0, что означает успешное выполнение.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д