Преобразование строки в вектор - 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;
}

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

  1. Объявлены основные переменные:
    • string - указатель на строку, которую необходимо разбить на подстроки. Значение строки - SHELL=/bin/bash:usr=monty:PWD=/bin/monty:LANG=en_US.UTF-8.
    • len - длина строки.
    • i, j, k - индексы для обработки строки.
    • result - указатель на массив указателей на строки, который будет хранить результат разбиения.
    • sep - разделитель строк.
  2. В цикле for происходит обработка каждого символа строки:
    • Если текущий символ равен разделителю, то выполняется следующее действие:
    • Если длина текущей подстроки меньше, чем максимальная длина подстрок в массиве result, то:
      • Выделяется память под новую строку.
      • Строка копируется в новую строку.
      • Устанавливается новый индекс для начала следующей подстроки.
    • Если длина текущей подстроки равна максимальной длине подстрок в массиве result, то устанавливается новый индекс для начала следующей подстроки.
    • Если длина текущей подстроки больше максимальной длины подстрок в массиве result, то выделяется память под новую строку и копируется в нее текущая подстрока.
  3. После обработки всех символов строки, выводится результат:
    • В цикле for перебираются все строки в массиве result.
    • Для каждой строки выводится ее значение.
  4. В конце программы запрашивается ввод символа для подтверждения выполнения программы.
  5. Программа возвращает 0, что означает успешное выполнение.

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


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

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

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