如何在C中连续添加字符串元素?

时间:2017-12-18 21:33:42

标签: c string function repeat

我想连续添加字符串元素,例如st[]="morty",我想重复其元素,例如七次。它应该是st[]="mortymo"。我写了一个函数,如下所示。 (长度函数为strlen)。

    void repeat(char* st,int n){
         int i,k=0,l=length(st);
         char* ptr;
         ptr=(char*)malloc((n+1)*sizeof(char));
         for (i=0;i<n;i++){
              *(ptr+i)=*(st+k);
              k++;
              if(k==l)k=0;
         }
    }

4 个答案:

答案 0 :(得分:1)

以下程序会重复原始字符串中的字符。 代码中的评论:

#include<stdio.h>
#include<stdlib.h>

 char* repeat(const char* st, size_t n){
         // use `const` to note that pointer `st` will not be modified
         // for purity you may want to use type `size_t` since returning type of strlen is `size_t` 

         size_t i, k=0;
         size_t l = strlen(st);

         // do not use (char *) cast
         char* ptr = malloc((n+1)*sizeof(char)); // allocate enough room for characters + NULL

         for (i=0; i< n; i++)
         {
              ptr[i] = st[k]; // use index for readability
              k++;

            if (k == l)
                k=0;
         }

         ptr[i] = 0; // terminate the string


    return ptr;
 }

int main( )
{
    char *str = "12345";

    str = repeat(str, 15);

    printf("%s\n",str);

    free (str); // free the allocated memory inside the repeat function

    return 0;
}

输出:

123451234512345 

答案 1 :(得分:0)

repeat函数中,您分配了ptr来保存重复的字符串,但您没有返回或将其分配给st。您可以按如下方式修改repeat功能:

    char* repeat(char* st,int n){
         int i,k=0,l=strlen(st);
         char* ptr;
         ptr=(char*)malloc((n+1)*sizeof(char));
         for (i=0;i<n;i++){
              *(ptr+i)=*(st+k);
              k++;
              if(k==l)k=0;
         }
        *(ptr+n) = '\0';
        return ptr;
    }

    /* some code*/
    char *st = "morty";
    st = repeat(st, 7);

这样您将重复字符串的结果存储在st之后。

答案 2 :(得分:0)

如果我正确理解了作业,那么你需要一个像演示程序中所示的功能。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char * repeat( const char *s, size_t n )
{
    char *p = NULL;

    size_t len = strlen( s );

    if ( len == 0 ) n = 0;

    p = ( char * )malloc( n + 1 );

    if ( p )
    {
        size_t i = 0;

        for ( size_t j = 0; i < n; i++ )
        {
            p[i] = s[j];
            if ( ++j == len ) j = 0;
        }

        p[i] = '\0';
    }


    return p;
}

int main(void) 
{
    char *s = "Hi, Zusaetlich.";

    char *p = repeat( s, 2 * strlen( s ) );

    puts( p );

    free( p );

    return 0;
}

程序输出

Hi, Zusaetlich.Hi, Zusaetlich.

请注意,该函数的设计方式是,如果原始字符串为空,则结果字符串也为空,因为没有任何内容可以重复。

至于你的函数,它至少有一个内存泄漏,因为函数中分配的内存没有被释放。

同样,由于原始字符串未更改,因此应使用const说明符限定相应的参数。第二个参数的类型应为size_t,因为至少函数strlen的返回类型为size_t

因此,应该在演示程序中显示该函数。

答案 3 :(得分:0)

由于您不打算修改void otherfunc() { Map<Key, Value> map = new MyMap<>(); myfunc(map); } void myfunc(Map<Key, Value> map) { Key k = someKey; Value v = someValue; map.put(k, v); } 的内容,请继续并将其声明为st。由于您打算在函数中分配新字符串,因此应将其返回给调用者。

const
您的问题不需要

char *repeat(const char* st,int n){ 。调用标准函数。

k

不要投射 int i,l=strlen(st); char* ptr; 的结果,因为这可以掩盖C中的致命错误。malloc总是1.检查sizeof(char)成功呼叫的结果

malloc

使用 ptr=malloc(n+1); if (ptr == NULL) return NULL; for (i=0;i<n;i++){ 以惯用方式访问数组。请注意,只要[]k会递增i,但您正在应用k的模运算。但是,C有一个模运算符,您可以直接在i上使用。

          ptr[i]=st[i%l];
     }

确保新字符串NUL已终止。声明您的函数返回结果,但您的实现无法执行此操作。

     ptr[n] = '\0';
     return ptr;
}

C有许多函数可以调用来为你复制,而不是你编写的逐字节循环。您的实现很简单,但下面是一个替代方案,还包括解决方案中缺少的其他错误检查。

(有些人可能会对使用sprintf感到不满,但正确使用它。)

char *
repeat (const char *st, int n) {
    int l = st ? strlen(st) : 0;
    char *ret = (st && n > 0 ? malloc(n+1) : 0), *p = ret;
    while (ret && n > 0) {
        p += sprintf(p, "%.*s", (l < n ? l : n), st);
        n -= l;
    }
    return ret ? ret : "(nil)";
}

Try it online!