C 言語で文字列と整数を連結する

胡金庫 2023年10月12日
  1. C で asprintfstrcat、および strcpy 関数を使用して String と Int を連結する
  2. 関数 asprintfmemccpy を用いて C 言語で文字列と整数を連結する
C 言語で文字列と整数を連結する

この記事では、C 言語で文字列と整数を連結するための複数の方法を示します。

C で asprintfstrcat、および strcpy 関数を使用して String と Int を連結する

変数 int と文字列を連結する最初のステップは、整数を文字列に変換することです。ここでは、渡された整数を文字列として格納するために asprintf 関数を利用します。asprintf は GNU C ライブラリの拡張機能の一部であり、他の実装では利用できない可能性があります。これは sprintf と似たように動作するが、格納先の文字列バッファは内部的に malloc 関数呼び出しを用いて動的に確保され、返されたポインタはプログラム終了前に解放されるべきであることを除けば、sprintf と同様に動作します。整数が変換されたら、strcpystrcat を連鎖的に呼び出して、ユーザが確保したバッファ内の 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

関数 asprintfmemccpy を用いて C 言語で文字列と整数を連結する

あるいは、asprintfmemccpy と併用して文字列や 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
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C String