将字符串附加到字符串

时间:2011-10-21 18:38:10

标签: c string

我正在尝试将字符串附加到字符串。

我试过

char *string = malloc(strlen(text) * sizeof (char));
for(i=0, i <n; i++)
{
    j = i;
    while (j <= strlen(text))
    {
        string[strlen(string)] = text[i];
        j = j + n;
    }
    string[strlen(string)] = '\0';
    printf("%s", string);
    string = "";
}

我的目标是创建text的变体。我的代码出现了分段错误。我做错了什么?

编辑:更清楚我想做的是: 让我们说text =“asdfghjk” 对于n = 3,我想要以下输出:

afj
sgk
dh

5 个答案:

答案 0 :(得分:2)

我会做类似的事情:

char *AppendCharToString( const char *orig, char newChar )
{
   int oldLength = strlen(orig);
   char *result = malloc( oldLength+2 ); // one byte for the new char, one for the terminator
   strcpy(result, orig);
   result[oldLength] = newChar;
   result[oldLength+1] = 0;
   return result;
}

答案 1 :(得分:1)

这就是你想要的。

// Params
char *text = "asdfghjk";
int n = 3;
// Code
int i, j, k, len = strlen(text);
char *s = malloc((len + 1) * sizeof (char));
for (i = 0, i < n; i++) {
    for (j = i, k = 0; j < len; j += n) s[k++] = text[j];
    s[k] = 0;
}
printf("%s\n", s);

首先,一个终止为零的字符串将占用strlen()+ 1个字节的空间。不只是strlen()。 其次,不要在循环中使用strlen()。在int中预先计算并使用它。 第三,你有一个错误:你有文字[i],但意思是文字[j]。 第四,作为前面提到的答案的作者,如果字符串还没有终止零,则无法计算字符串的长度。 第五,你不需要在每次迭代后清除一个字符串,因为覆盖它的字符并添加新的终止零将使它成为全新的字符串。

答案 2 :(得分:0)

你应该只创建一个新的String,在它的底部附加`string [strlen(string)] ='\ 0';     printf(“%s”,string);     string = new String(“”);

`

答案 3 :(得分:0)

string[strlen(string)] = '\0';

这不会按预期工作。 string不会以NULL结尾,因此strlen()将在\ 0的字符串末尾后面查找,并且不会找到它。 (如果确实如此,你会用\ 0覆盖\ 0)。你想要的是那里的strlen(文本)。然后

char *string = malloc(strlen(text) + 1);

有足够的空间。

答案 4 :(得分:0)

回答问题,因为最初说明如何将单个字符附加到字符串的末尾,该字符串没有为其分配空间。

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

/* note that str can be NULL for a new string */
char *straddchr(char *str, int c) {
    size_t len = str ? 2+strlen(str) : 2;
    char *p = realloc(str, len); /* add space (need space for char and \0) */
    if ( !p ) 
        return str;
    str = p;
    str[len-2] = c; 
    str[len-1] = 0;
    return str;
}

int main() {
    char *str = NULL;
    str = malloc(5);
    strcpy(str, "Hell");
    str = straddchr(str, 'o');
    str = straddchr(str, ' ');
    str = straddchr(str, 'w');
    str = straddchr(str, 'o');
    str = straddchr(str, 'r');
    str = straddchr(str, 'l');
    str = straddchr(str, 'd');
    printf("%s\n", str);
}

这是第二位在每个'n'位置插入一个字符

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

/* note that str can be NULL for a new string */
char *strinjectchr(char *str, int c, int n) {
    size_t len = str ? strlen(str) + n + 1: n + 1;
    str = realloc(str, len);
    char *p;
    int i;

    if ( len == 1+n ) { /* original string was NULL */
    str[n] = 0;
    return memset(str, c, len-1); /* just use memset and send it all back */
    }

    char *copy = strdup(str);
    for (i = 0, p = copy; *p != 0; p++) {
        str[i++] = *p;
        if ( (i > 0) && ((1+(p - copy))%n == 0) ) {
             str[i] = c;
             i++;
    }
    }
    str[len] = 0;
    free(copy);
    return str;
}

int main() {
    char *str = NULL;
    str = strinjectchr(str, 'X', 25);
    printf("str is: %s\n", str);
    str = strinjectchr(str, '-', 5);
    printf("str is: %s\n", str);
    str = strdup("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
    str = strinjectchr(str, '\n', 3);
    printf("str is: %s\n", str);
}