C - Разделение строки на массив из n подстрок без разделителя. - PullRequest
0 голосов
/ 17 марта 2019

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

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]);
    }
}

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

С помощью %3c можно сканировать три символа.Это не завершает массив нулем, поэтому нельзя использовать ни одну из строковых функций, ожидающих, что нулевой терминатор.
Спецификатор %n вернет количество символов, обработанных при сканировании.
Печать может быть выполненаограничивая количество символов в поле точности в %.3s

#include <stdio.h>
#include <stdlib.h>

int main( void) {

    char str[]="ABCDEFGHIJKL";
    int count = 0;
    int span = 0;
    int used = 0;
    char arr[6][3]={};

    while ( count < 6 && 1 == sscanf ( str + span, "%3c%n", &arr[count][0], &used)) {
        count++;
        span += used;//accumulate number of scanned characters
    }

    while ( count) {
        count--;
        printf ( "%.3s\n", arr[count]);//print up to three characters
    }

    return 0;
}
0 голосов
/ 17 марта 2019

Просто пройдите всю строку и поместите каждый символ на свое место. Не забывайте, что строка «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("%s\n", arr[i]);
}

ABC
DEF
ГХИ
JKL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...