C 言語で文字列と整数を連結する
-
C で
asprintf
、strcat
、およびstrcpy
関数を使用して String と Int を連結する -
関数
asprintf
とmemccpy
を用いて C 言語で文字列と整数を連結する
この記事では、C 言語で文字列と整数を連結するための複数の方法を示します。
C で asprintf
、strcat
、および strcpy
関数を使用して String と Int を連結する
変数 int
と文字列を連結する最初のステップは、整数を文字列に変換することです。ここでは、渡された整数を文字列として格納するために asprintf
関数を利用します。asprintf
は GNU C ライブラリの拡張機能の一部であり、他の実装では利用できない可能性があります。これは sprintf
と似たように動作するが、格納先の文字列バッファは内部的に malloc
関数呼び出しを用いて動的に確保され、返されたポインタはプログラム終了前に解放されるべきであることを除けば、sprintf
と同様に動作します。整数が変換されたら、strcpy
と strcat
を連鎖的に呼び出して、ユーザが確保したバッファ内の 2つの文字列を連結します。この場合、任意に MAX
マクロを定義してバッファのサイズを指定していますが、実際のシナリオでは malloc
を使った方が柔軟性が高いでしょう。
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef MAX
#define MAX 100
#endif
int main(int argc, char *argv[]) {
const char *str1 = "hello there";
int n1 = 1234;
char *num;
char buffer[MAX];
if (asprintf(&num, "%d", n1) == -1) {
perror("asprintf");
} else {
strcat(strcpy(buffer, str1), num);
printf("%s\n", buffer);
free(num);
}
exit(EXIT_SUCCESS);
}
出力:
hello there1234
あるいは、連鎖した呼び出しの後に strcat
関数を呼び出し、与えられた char
バッファに他の文字列を追加することもできます。関数 asprintf
の戻り値が成功したかどうかをチェックし、失敗した場合は連結処理を続けることに注意してください。
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef MAX
#define MAX 100
#endif
int main(int argc, char *argv[]) {
const char *str1 = "hello there";
int n1 = 1234;
char *num;
char buffer[MAX];
if (asprintf(&num, "%d", n1) == -1) {
perror("asprintf");
} else {
strcat(strcpy(buffer, "Hello there, "), num);
strcat(buffer, "! continued");
printf("%s\n", buffer);
free(num);
}
exit(EXIT_SUCCESS);
}
出力:
Hello there, 1234! continued
関数 asprintf
と memccpy
を用いて C 言語で文字列と整数を連結する
あるいは、asprintf
を memccpy
と併用して文字列や int
を連結することもできます。memccpy
は、<string.h>
ヘッダファイルで定義されている C 標準ライブラリの文字列ユーティリティの一部です。ソースバッファとデスティネーションバッファを示す 2つのポインタを受け取ります。これらのバッファメモリ領域は重なってはならないことに注意してください。最後の 2つの引数は、コピーを停止する文字と、コピー元の場所から取り出される最大バイト数を表します。そうしないと、num
ポインタが有効なポインタであることを確認できないため、else
スコープ内で free
関数を呼び出します。
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef MAX
#define MAX 100
#endif
int main(int argc, char *argv[]) {
const char *str1 = "hello there";
int n1 = 1234;
char *num;
char buffer[MAX];
if (asprintf(&num, "%d", n1) == -1) {
perror("asprintf");
} else {
memccpy(memccpy(buffer, str1, '\0', MAX) - 1, num, '\0', MAX);
printf("%s\n", buffer);
free(num);
}
exit(EXIT_SUCCESS);
}
出力:
hello there1234