Cの文字列に単一の文字を追加するにはどうすればよいですか?
すなわち
char* str = "blablabla";
char c = 'H';
str_append(str,c); /* blablablaH */
Cの文字列に文字を追加するには、最初に、文字列を含むメモリバッファが、余分な文字を収容するのに十分な大きさであることを確認する必要があります。サンプルプログラムでは、指定されたリテラル文字列は変更できないため、新しい追加のメモリブロックを割り当てる必要があります。
サンプルは次のとおりです。
#include <stdlib.h>
int main()
{
char *str = "blablabla";
char c = 'H';
size_t len = strlen(str);
/* one for extra char, one for trailing zero */
char *str2 = malloc(len + 1 + 1);
strcpy(str2, str);
str2[len] = c;
str2[len + 1] = '\0';
printf("%s\n", str2); /* prints "blablablaH" */
free(str2);
}
まず、を使用malloc
して、入力文字列のすべての文字、追加する追加の文字、および最後のゼロを収容するのに十分な大きさの新しいメモリチャンクを割り当てます。次に、を呼び出しstrcpy
て、入力文字列を新しいバッファにコピーします。最後に、新しいバッファの最後の2バイトを変更して、追加する文字と末尾のゼロを追加します。
char* str = "blablabla";
この文字列はまったく変更しないでください。これは、実装で定義された読み取り専用領域にあります。これを変更すると、未定義動作が発生します。
文字列リテラルではなく、char配列が必要です。
Linuxが懸念される場合は、2つの文字列を追加する最も簡単な方法は次のとおりです。
char * append(char * string1, char * string2)
{
char * result = NULL;
asprintf(&result, "%s%s", string1, string2);
return result;
}
これはMSVisualCでは機能しません。
注:free()
によって返されるメモリが必要ですasprintf()
cでそのような文字列を宣言できるとは思いません。これはconstchar*に対してのみ行うことができ、もちろんconstchar*はconstであるため変更できません。
動的char配列を使用することもできますが、再割り当てには注意が必要です。
編集:実際、この構文は正しくコンパイルされます。それでも、(文字列リテラルから)実行する方法で初期化された場合、strが指すものを変更することはできません。
オリジナルのポスターは書くつもりはありませんでした:
char* str = "blablabla";
しかし
char str[128] = "blablabla";
これで、strcatを使用して文字列全体を追加するよりも、単一の文字を追加する方が効率的であるように思われます。strcatの方法で進むと、次のことができます。
char tmpstr[2];
tmpstr[0] = c;
tmpstr[1] = 0;
strcat (str, tmpstr);
しかし、あなたは簡単にあなた自身の関数を書くこともできます(私の前にいくつかが行ったように):
void strcat_c (char *str, char c)
{
for (;*str;str++); // note the terminating semicolon here.
*str++ = c;
*str++ = 0;
}
新しい文字列を作成します(文字列+文字)
#include <stdio.h>
#include <stdlib.h>
#define ERR_MESSAGE__NO_MEM "Not enough memory!"
#define allocator(element, type) _allocator(element, sizeof(type))
/** Allocator function (safe alloc) */
void *_allocator(size_t element, size_t typeSize)
{
void *ptr = NULL;
/* check alloc */
if( (ptr = calloc(element, typeSize)) == NULL)
{printf(ERR_MESSAGE__NO_MEM); exit(1);}
/* return pointer */
return ptr;
}
/** Append function (safe mode) */
char *append(const char *input, const char c)
{
char *newString, *ptr;
/* alloc */
newString = allocator((strlen(input) + 2), char);
/* Copy old string in new (with pointer) */
ptr = newString;
for(; *input; input++) {*ptr = *input; ptr++;}
/* Copy char at end */
*ptr = c;
/* return new string (for dealloc use free().) */
return newString;
}
/** Program main */
int main (int argc, const char *argv[])
{
char *input = "Ciao Mondo"; // i am italian :), this is "Hello World"
char c = '!';
char *newString;
newString = append(input, c);
printf("%s\n",newString);
/* dealloc */
free(newString);
newString = NULL;
exit(0);
}
0 1 2 3 4 5 6 7 8 9 10 11
newString is [C] [i] [a] [o] [\32] [M] [o] [n] [d] [o] [!] [\0]
[len +1]
正確なサイズを知らずに配列サイズ(など)を変更しないでください。他のデータが破損する可能性があります。alloc
新しいサイズの配列で、代わりに古いデータを内部に配置します。char配列の場合、最後の値は\0
;でなければならないことに注意してください。calloc()
すべての値をに設定します。これは配列\0
に最適です。char
これがお役に立てば幸いです。
Cには文字列自体はありません。つまり、文字「blablabla\0」を含む読み取り専用メモリを指すcharポインタがあります。そこに文字を追加するには、a)書き込み可能なメモリとb)新しい形式の文字列用の十分なスペースが必要です。文字列リテラル「blablabla\0」にはどちらもありません。
解決策は次のとおりです。
1)malloc()
他を使用します。動的にメモリを割り当てます。free()
(後で忘れないでください。)
2)char配列を使用します。
strn*
文字列を操作するときは、関数のバリアントの使用を検討しstr*
てください。これらは、メモリの範囲内にとどまるのに役立ちます。
strcat
標準ヘッダーでを使用できますが、2番目の引数としてstring.h
を渡さないでくださいchar
。代わりに、次のコードを使用してください。
void append_str(char str[] , char c){
auto char arr[2] = {c , '\0'};
strcat(str , arr);
}
strncat()を使用できます
#include <stdio.h>
#include <string.h>
int main(void){
char hi[6];
char ch = '!';
strcpy(hi, "hello");
strncat(hi, &ch, 1);
printf("%s\n", hi);
}
私の場合、これは私が見つけた最良の解決策でした:
snprintf(str, sizeof str, "%s%c", str, c);
これがそれです、それは100%働きます
char* appending(char *cArr, const char c)
{
int len = strlen(cArr);
cArr[len + 1] = cArr[len];
cArr[len] = c;
return cArr;
}