2011-10-21 9 views
1

文字列にcharを追加しようとしています。 文字列に文字を追加する

私はこのコードでセグメンテーションフォールトを得た

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 .Iのバリエーションを作成してみました。何が間違っているのですか?

EDITは:私が何をしたいか、より明確にすることです: は、テキスト=「asdfghjk」 を言うと、N = 3のために、私は次のような出力をしたいことができます:

afj 
sgk 
dh 
+0

あなたが達成しようとしているかを説明することはできますか? – cnicutar

+0

これはヒントです: 'strlen'はO(1)操作ではありません。あなたがそれを呼び出すたびに、文字列の長さを( '' \ 0 ''を見つけることに基づいて)再計算します。一度呼び出すと変数に格納し、文字列に追加すると変数を更新するのが一般的です。これは3回呼び出すよりです。 –

+1

ヌルターミネータが 'string'に設定されていないときは' strlen(string) 'することはできません。これにより、セグメンテーションフォルトが生成されます。 – 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()だけでなく 2番目に、ループ内でstrlen()を使用しないでください。それをintで事前に計算して使用してください。 第3に、あなたはエラーがありました:あなたはテキスト[i]を持っていましたが、テキスト[j]を意味しました。 第4に、前述の前回の回答の著者として、文字列の終端がまだゼロでない場合、文字列の長さを計算することはできません。 5文字目を上書きしてから各繰り返しの後に文字列を消去する必要はなく、新しい終端ゼロを追加すると完全に新しい文字列になります。

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"、文字列); 文字列=新しい文字列( "");予想通り

`

+2

これはCではなくCです。 –

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

これは動作しません。 stringは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); 
} 

そして、ここに文字を挿入する第2ビットは、すべて「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

インデントはコード内で少し外れていますが、エディタで修正することができますが、これは少し痛いものです。 –

関連する問題