2011-10-21 224 views
1

我試圖將字符附加到字符串。將字符附加到字符串

我試圖

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。我的變化有段錯誤與此代碼。我究竟做錯了什麼?

編輯:要更清楚我想要做的是: 可以說文本=「asdfghjk」 當n = 3,我想下面的輸出:

afj 
sgk 
dh 
+0

你能解釋一下你想要達到的第二位? – cnicutar

+0

這是一個提示:'strlen'不是一個O(1)操作。它會在每次調用它時重新計算字符串長度(基於找到尾部的'\ 0')。通常最好調用一次,並將其存儲在變量中,如果添加到字符串中,則更新變量,而不是調用它三次。 –

+1

當空終止符未被設置爲「字符串」時,您不能'strlen(字符串)'。這會產生分段錯誤。 – user482594

回答

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中預先計算並使用它。 第三,你有一個錯誤:你有文字[我],但意味着文字[J]。第四,作爲前面提到的答案的作者,如果字符串沒有終止零,你就不能計算字符串的長度。第五,你不需要在每次迭代之後清除一個字符串,因爲覆蓋它的字符並且添加新的終止零將使它成爲完全新的字符串。

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; 
} 
+0

's/int/size_t/g' –

+0

如果你的字符串大於整數的大小,我不會推薦這種方法。 :-)(當然你是對的,但我有時老派) – EricS

+0

是的。儘管如此,我對你應該推薦的大型字符串感興趣。 –

0

你應該創建一個新的字符串,追加到它,你想要什麼,在底部其中`字符串[strlen的(串)] =「\ 0」; printf(「%s」,string); string = new String(「」);如預期

`

+2

這是C,而不是C++。 –

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

這是行不通的。字符串不會以NULL結尾,所以strlen()會在\ 0的字符串末尾後面查找,並且不會找到它。 (如果是這樣,你會用\ 0覆蓋\ 0)。你想要的是strlen(文本)那裏。然後

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

要有足夠的空間。

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); 
} 
+0

縮進在代碼中有點不合適,但是您可以在編輯器中修復這些,這在這裏有點痛苦。 –