C — Разбиение строки на массив из n подстрок без разделителя

#c #arrays #string

#c #массивы #строка

Вопрос:

Допустим, у нас есть эта входная строка:

 str[1024]="ABCDEFGHIJKL"
  

И хотел бы, чтобы этот выходной массив:

 {"ABC", "DEF", "GHI", "JKL"}
  

Как можно разделить каждые 3 символа в str на массив подстрок?

Вот мой код, но он печатает только первые 3 символа, фактически не сохраняя их в массиве:

 int main(){
    char str[MAX]="ABCDEFGHIJKL";
    int count=0, i=0;
    char sub[3];
    char arr[6][3]={};

    while (count<3){
        sub[i]=str[i count];
        count  ;
        printf("%c", sub[i]);
    }
}
  

Комментарии:

1. [3] слишком короткий, чтобы содержать символ nul, который вам нужен для создания правильных строк C и их печати.

2. только если вам нужно, чтобы они завершались нулем, при этом говорилось

3. Вы указываете программе копировать только первые 3 символа. Они хранятся в, sub[] но arr[][] остаются неиспользованными.

Ответ №1:

Просто просмотрите всю строку и поместите каждый символ на свое место. Не забывайте, что строка «ABC» занимает четыре байта.

По мере перебора символов входной строки, в какую выходную строку они переходят, выглядит следующим образом:

0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3

Это i/3 . Схема того, в какую позицию в выходных данных они попадают, выглядит следующим образом:

0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2

Это i%3 . Таким образом, если i это позиция во входной строке, то позиция в выходном массиве равна [i/3][i%3] . Таким образом:

 #include <stdio.h>
#include <string.h>

#define MAX 512

int main(){
    char str[MAX]="ABCDEFGHIJKL";
    int count=0, i=0;
    char sub[3];
    char arr[MAX/3][4]={};

    /* Go through the string putting each character in
       its proper place */
    for (int i = 0; i < strlen(str);   i)
        arr[i/3][i%3] = str[i];

    /* Print the strings out */
    for (int i = 0; i < (strlen(str) / 3);   i)
        printf("%sn", arr[i]);
}
  

ABC
DEF
GHI

JKL