返回字符串重复x次

时间:2014-03-24 01:22:55

标签: c arrays string function repeat

有人可以帮我解决这个问题。

char * repeat(char * s,int x)

返回一个新字符串,该字符串由重复x次的s字符组成。例如,如果s是字符串,则该函数可以正确地返回新字符串。如果s为NULL,则该函数返回NULL。

由调用者释放该函数分配的任何内存。

这是我到目前为止所拥有的......

char * repeat(char * s,int x){

int i;
int count = 0;

while(s[count] != '\0')
{
    count++;
}

int repeat = count * x;
char *newArray = malloc(5000);

for(i = 0; i < repeat; i++)
{   
    while(*s != '\0')
        *newArray++ = *s++;     
}

return (char*)newArray;

}

3 个答案:

答案 0 :(得分:0)

char *repeat(const char *s, int x){
    if(s){
        int i, count = 0;

        while(s[count] != '\0'){
            ++count;
        }

        char *newArray = malloc(count * x + 1);
        if(newArray){
            char *na = newArray;
            for(i = 0; i < x; ++i) {
                const char *p=s;
                while(*p)
                    *na++ = *p++;
            }
            *na = '\0';
        }
        return newArray;
    } else {
        return NULL;
    }
}

答案 1 :(得分:0)

主要问题 - 假设您只获得一份副本 - 是您需要&#34;重置&#34;你的副本之间的指针s。现在,你到了s的末尾,所以连续的迭代试图复制"\0"的字符串。

两个潜在的其他问题(未来)是:

  • 你应该使用(我猜你知道这个而且不允许这样做)strcpy()进行复制。
  • 应始终由函数的调用者分配内存。指向新字符串的指针在调用堆栈上,内存在技术上分配给repeat()的堆上,因此当您返回时,运行时没有义务保留任何调用者使用它。它通常有效,&#34;但这可能是非常危险的。

答案 2 :(得分:-2)

首先分配内存然后复制/移动内存。 供您参考,一个简单的(不完全测试):



char *repeat(char *s, int x)
{
    char *result = malloc(sizeof(s) * x + 1);

    while (x > 0) {
        strcat(result, s);
        x --;
    }

    return result;
}
int main(int argc, const char * argv[])
{

    // insert code here...
    char *sample = "hell";
    char *result = repeat(sample, 3);


    printf("result : %s\n", result);

    free(result);
    return 0;
}

你最好:

  1. 不要忘记x应该是整数且大于0;
  2. 始终记得 free创建的字符串