как повторить строку на языке C - PullRequest
0 голосов
/ 24 апреля 2011

как мне повторить строку?что-то вроде "Привет, мир" * 3 вывод "Привет, мир, Привет, мир, привет!"

Ответы [ 6 ]

12 голосов
/ 24 апреля 2011

В вашем исходном коде, без особой обработки, возможно, самый простой способ - это:

#define HI "hello world"
char str[] = HI " " HI " " HI;

Это объявит строку запрошенного значения:

"hello world hello world hello world"

Если вы хотите код , который это сделает, вы можете использовать что-то вроде:

char *repeatStr (char *str, size_t count) {
    if (count == 0) return NULL;
    char *ret = malloc (strlen (str) * count + count);
    if (ret == NULL) return NULL;
    strcpy (ret, str);
    while (--count > 0) {
        strcat (ret, " ");
        strcat (ret, str);
    }
    return ret;
}

Теперь имейте в виду, что это можно сделать более эффективным - несколько операций strcat созрели для оптимизации, чтобы избежать обработкиданные снова и снова (a) .Но это должно быть достаточно хорошим началом.

Вы также несете ответственность за освобождение памяти, возвращаемой этой функцией.


(a) Например, с:

// Like strcat but returns location of the null terminator
//   so that the next myStrCat is more efficient.

char *myStrCat (char *s, char *a) {
    while (*s != '\0') s++;
    while (*a != '\0') *s++ = *a++;
    *s = '\0';
    return s;
}

char *repeatStr (char *str, size_t count) {
    if (count == 0) return NULL;
    char *ret = malloc (strlen (str) * count + count);
    if (ret == NULL) return NULL;
    *ret = '\0';
    char *tmp = myStrCat (ret, str);
    while (--count > 0) {
        tmp = myStrCat (tmp, " ");
        tmp = myStrCat (tmp, str);
    }
    return ret;
}
2 голосов
/ 24 апреля 2011

Вы можете использовать sprintf.

char s[20] = "Hello";
char s2[20];
sprintf(s2,"%s%s%s",s,s,s);
0 голосов
/ 23 декабря 2017

Я сделал эту функцию на основе предыдущих ответов в этом посте.Я делюсь этим здесь, потому что некоторые из предыдущих примеров были брошены мне segfaults

const char* str_repeat(char* str, size_t times)
{
    if (times < 1) return NULL;
    char *ret = malloc(sizeof(str) * times + 1);
    if (ret == NULL) return NULL;
    strcpy(ret, &str);
    while (--times > 0) {
        strcat(ret, &str);
    }
    return ret;
}
0 голосов
/ 14 марта 2017

Вот способ повторить строку в C, N раз.

То есть есть строка "abc", и я хочу, чтобы строка длиной 7 повторялась из этой строки.

N = 7;результат: "abcabca"

 while(Index != N){

    repeatedString[Index] = oldString[Index%strlen(oldString)];
    Index++;
 }

Где повторяющаяся строка будет "abcabca" в конце, а oldString будет "abc".

0 голосов
/ 13 февраля 2017

Вы можете попробовать написать собственную функцию. Он также будет работать со строкой одинарной длины (т.е. дублирование одного символа). Он использует функцию "strcat ()" из "string.h", поэтому не забудьте включить этот заголовок.

char *
str_repeat(char str[], unsigned int times)
{
    if (times < 1)
        return NULL;

    char *result;
    size_t str_len = strlen(str);
    result = malloc(sizeof(char) * str_len + 1);

    while (times--) {
        strcat(result, str);
    }
    return result;
}

Но, если вам нужно только дублирование строки для печати, попробуйте макрос

#define PRINT_STR_REPEAT(str, times) \
{ \
    for (int i = 0; i < times; ++i) \
        printf("%s", str); \
    puts(""); \
}

Результаты

PRINT_STR_REPEAT("-", 10); // ----------
puts(str_repeat("-", 10)); // ----------

PRINT_STR_REPEAT("$", 2); // $$
puts(str_repeat("$", 2)); // $$

PRINT_STR_REPEAT("*\t*", 10); // *   **  **  **  **  **  **  **  **  **  *
puts(str_repeat("*\t*", 10));  // *   **  **  **  **  **  **  **  **  **  *

PRINT_STR_REPEAT("*_*", 10); // *_**_**_**_**_**_**_**_**_**_*
puts(str_repeat("*_*", 10)); // *_**_**_**_**_**_**_**_**_**_*
0 голосов
/ 21 августа 2016

http://ideone.com/5sNylW

#include <stdio.h>
#include <string.h>
int main(void) {
     char k[100];
     gets(k);
     int lk=strlen(k);
     int times;
     scanf("%d",&times);
     int tl= times*lk;
     int i,x=0;
        for(i=lk-1;i<tl;i++)
        {
        k[i+1]=k[x];
        x++;
        }
    for(i=0;i<tl;i++)
    {
    printf("%c",k[i]);
    }

     return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...