Нет причин настраивать итерацию в цикле 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
strcat
? Он копирует строку (оканчивающуюся нулем, как обычно в C), а не символ. И почему вы перебираете [0,4) - диапазон, состоящий всего из 4 элементов? - person Werner Henze   schedule 07.02.2019char tempStr[5]="";
этого недостаточно для 5 символов плюс завершающий символ NUL - person user3629249   schedule 07.02.2019