Как извлечь массив подсимволов из массива символов

Я пытаюсь создать сопоставление, в котором я сравниваю 5 символов и сопоставляю их с регистром. Моя проблема заключается в синтаксисе массивов символов, и, возможно, есть более простой способ извлечь подмассивы.

Моя общая идея такова:

char str[80];
char tempStr[5]="";
int i=0;

for(i=0; i<4; i++){
   strcat(tempStr,str[i]);


}
// match tempStr to cases
// go back to loop through for the next tempStr

Пример ввода:

"Iliveon123streetUnitedStatesOfAmericaSSS"

Каждый раз, когда я перебираю, я хотел бы извлечь подмассив

"Ilive"
"on123"
"stree"
"tUnit"
"edSta"
"tesOf"
"Ameri"
"caSSS"

и сравните эту временную строку


person Bartleby T. Scrivener    schedule 07.02.2019    source источник
comment
Вы читали документацию strcat? Он копирует строку (оканчивающуюся нулем, как обычно в C), а не символ. И почему вы перебираете [0,4) - диапазон, состоящий всего из 4 элементов?   -  person Werner Henze    schedule 07.02.2019
comment
относительно: char tempStr[5]=""; этого недостаточно для 5 символов плюс завершающий символ NUL   -  person user3629249    schedule 07.02.2019
comment
цикл извлекает только 4 символа, но желаемый результат показывает извлечение 5 символов   -  person user3629249    schedule 07.02.2019


Ответы (2)


Нет причин настраивать итерацию в цикле for. Лучший подход — просто зацикливаться, пока есть еще символы для вывода, которые еще не были выведены. Рассмотрим strlen вашей входной строки, которую вы будете разбивать на куски размером с блок и выводить каждую итерацию. Закончив вывод блока, просто вычтите выходной размер блока из длины, чтобы определить количество оставшихся символов. Продолжайте до тех пор, пока не останется меньше символов размера блока или не останется ни одного символа.

Если на последней итерации осталось вывести менее полного размера блока символов, просто обновите размер блока до оставшейся длины и выведите это количество символов.

Нет необходимости сканировать конец строки с помощью strcpy и т. д. Размер блока определяет количество символов в каждой подстроке, поэтому вы можете просто memcpy ввести свои символы, добавив символ nul-terminating. в substring[blksz], а затем выводит результирующую строку (с экранированными кавычками, как вы показываете)

Минимальный пример использования вашего ввода может быть:

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

#define BLKSZ 5

int main (void) {

    char str[] = "Iliveon123streetUnitedStatesOfAmericaSSS",
        blk[BLKSZ + 1];         /* storage for each substring */
    size_t len = strlen (str),  /* length of str */
        blksz = BLKSZ,          /* initial blocksize */
        n = 0;                  /* block counter */

    while (len) {           /* while chars remain to copy */
        memcpy (blk, str + n++ * BLKSZ, blksz); /* copy blocksize chars */
        blk[blksz] = 0;     /* nul-terminate block */
        printf ("\"%s\"\n", blk);   /* output block */
        len -= blksz;       /* subtract blocksize from len */
        if (len < blksz)    /* less than blocksize remains, blksz is len */
            blksz = len;
    }
}

Пример использования/вывода

$ ./bin/strsubstr
"Ilive"
"on123"
"stree"
"tUnit"
"edSta"
"tesOf"
"Ameri"
"caSSS"

Просмотрите все и дайте мне знать, если у вас есть дополнительные вопросы.

person David C. Rankin    schedule 07.02.2019

Во-первых, tempStr должен иметь длину 6 байт (5 для символов, 1 для последнего 0).

Вы можете «извлечь» 5-символьные подстроки строки с помощью цикла, подобного этому:

for (i = 0; i < strlen(inputString); i += 5) {
    strncpy(tempStr, inputString + i, 5);
    tempStr[5] = 0;
    // do something
}
person rene-d    schedule 07.02.2019