Как извлечь массив sub char из массива char - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь создать сопоставление, в котором я сравниваю 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"

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

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

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

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

Нет необходимости сканировать конец строки, используя strcpy и т. Д. Ваш размер блока определяет количество символов в каждой подстроке, поэтому вы можете просто memcpy свои символы, добавив Nul-заканчивающий символ в 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"

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

0 голосов
/ 07 февраля 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...