Есть некоторые проблемы с вашим кодом. Во-первых, вы вызываете strcat
для целевого массива, который не был инициализирован. Сначала нужно установить str[0] = '\0';
.
Другие проблемы - алгоритми c. Чтобы знать, куда вставить целевую строку, strcat
должен делать strlen
или эквивалентный каждый раз, когда вы вызываете ее. Это означает, что он каждый раз перебирает O(n)
символов. Это делает ваш алгоритм ~O(n^2)
. Затем вы go и снова вызываете strlen
для каждого персонажа, с тем же штрафом. И имейте в виду, что второй l oop просто устанавливает для всего массива значение 'H'
.
Если вы хотите скопировать строку 10000
раз, вам лучше предварительно вычислить ее длину и просто шагая вдоль буфера:
char str[100005];
const char *template = "HelloWorld";
int n = strlen(template);
char *p = str;
for(int i = 0; i < 10000; i++) {
strncpy(p, template, n);
p += n;
}
*p = '\0';
Я использую strncpy
здесь, потому что он позволяет избежать копирования завершающего '\0'
из template
для каждой копии, которую вы делаете.
Альтернативный подход было бы использовать деление по модулю (что, вероятно, было бы медленнее) для размещения символов:
char str[100005];
const char *template = "HelloWorld";
int n = strlen(template);
int end = n * 10000;
for(int i = i; i < end; i++) {
str[i] = template[i % n];
}
Оба подхода занимают на мою машину на пару порядков меньше времени, чем ваш исходный l oop, потому что они проходят через массив ровно один раз.
Последний l oop копирует предыдущий символ снова и снова в оставшуюся часть буфера. Поскольку ваш буфер заполнен HelloWorld
, l oop копирует 'H'
в каждое место. Вы можете использовать memset
, чтобы сделать то же самое для вас:
memset(str, 'H', 10000 * n);
Мораль этой истории - избегать пересчета вещей, которые вы можете отслеживать с помощью простого счетчика или указателя. Если вы хотите, чтобы все было быстро go, выполняйте как можно меньше работы.