Нет причин устанавливать итерацию в цикле 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"
Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.