Project_OKI’s diary

エンジニアの勉強ブログ

C言語基礎知識30(数値を文字列に変換)

数値(変数)を文字列に変換する

この記事では、C言語で数値を文字列に変換する。

 

1. 目的

 ・C言語で取得した数値を文字列に変換する方法について理解する。

 

目次

 

2. 取得した数値を文字列に変換する方法

 2.1数値を文字列に変換する関数

 数値を文字列に変換する関数は下記3つ存在する。

 それぞれの使い方、メリット、デメリットについて記載していく。

 ・sprintf関数

 ・snprintf関数

 

 2.2 使用方法:sprintf 関数

  ① 必要ヘッダファイル:stdio.h

  ② 変換したい数値と格納する文字列を用意する。

    関数:sprintf(文字列バッファ, フォーマット文字列, 変換する数値1, 変換する数値2, ...);

  例:

  int num = 123;
  char str[256];
  sprintf(str, "%d", num);

 

 2.3 プログラム作成(sprintf関数)
#include <stdio.h>
int main() {
  //数値を用意
  int num = 123;       
  int num2 = 10;
  float num3 = 1.1;
  
  char str[256];        //文字列を格納する変数
  
  //1つの数値を文字列に変換
  sprintf(str, "%d", num);
  printf("%s\n", str);
  
  //2つ数値を文字列に変換
  sprintf(str,"%d %d",num,num2);
  printf("%s\n", str);
  
  //少数を文字列に変換(有効数字1桁)
  sprintf(str,"%0.1f",num3);
  printf("%s\n",str);
  return 0;
}

実行結果:https://paiza.io/projects/p82CxIzm8a8uUrNHxy46zA?language=c

 

 2.4 プログラムの説明

  (a) sprintfはstdio.hに含まれる標準関数

  (b) char str[256]; 

   変換する数値を入れるための文字列バッファを用意する。

   指定されたバッファサイズを超える文字列を生成しようとすると

   バッファオーバーブローが発生し、プログラムがクラッシュする

   可能性があるため、注意する。

   (今回は、256個まで。)

  (c) sprintf(str, "%d", num);

  numをstrに文字列変換している。%d部分が数値が文字列になる。

 (d) sprintf(str,"%d %d",num,num2);

  この場合だと、123 10という結果が出力される。

  例えば「%d と %d」とすると、123と10がstr文字列に格納される。

 

 2.5 使用方法:snprintf関数

 ①必要ヘッダファイル:stdio.h

 ② 変換したい数値と格納する文字列を用意する。

   関数:sprintf(文字列バッファ, 格納可能文字数,フォーマット文字列, 変換する数値1, 変換する数値2, ...);

 例:

    int num = 123;
    char str[20];
    int len = snprintf(str, 20, "%d", num);

 ※20文字まで格納可能としている。

 ※lenには、変換した文字列の長さが格納される。

 

 2.6 プログラム作成(snprintf)
#include <stdio.h>

int main(void) {
    int num = 123;
    char str[20];
    int len = snprintf(str, 20, "%d", num);
    printf("str: %s, length: %d\n",str, len);
    return 0;
}

結果:https://paiza.io/projects/G5o3-niOcWbjOow3XC6Rzw?language=c

 

プログラム作成2

#include <stdio.h>
int main() {
  //数値を用意
  int num = 123;       
  int num2 = 1000000000;
  float num3 = 1.1;
  
  char str[256];        //文字列を格納する変数
  
  //2つ数値を文字列に変換
  sprintf(str,"%d %d",num,num2);
  printf("%s\n", str);
  
  snprintf(str,20,"%d %d",num,num2);
  printf("%s\n", str);  
  
  snprintf(str,10,"%d %d",num,num2);
  printf("%s\n", str);  
  
}

結果:https://paiza.io/projects/h3Phfe3MIIyhgmmGqOuISQ?language=c

 

 2.7 プログラムの説明

 (a) 基本はsprintfと同じだが、snprintfはこれを使用する時点で文字列の長さの制限が出来るため、バッファオーバーフローを防ぐことが出来る。

 

 (b) int len = snprintf(str, 20, "%d", num); 

  snprintfは、変換しようとするバイト数が返り値となる。

  今回は123の3文字を変換したため、lenには、3が入る。

 

  ※sprintfは、生成された文字列のバイト数を返すのに対し、

   snprintfは書き込もうとしたバイト数を返す。

   この違いは、snprintfが書き込みに失敗した場合にも、

   書き込もうとしたバイト数が返される。

   一方、sprintfは、書き込みに失敗すると負の値が返される。

   そのため、sprintfの方は、失敗時の処理を行いにくい。

 

 (c) snprintf(str,10,"%d %d",num,num2);

  プログラム2では文字列の長さを10に指定しているため、

  それ以上長くなる場合、文字列が10文字で制限される。

 

 (d) 使う際の注意事項

  snprintf関数は、大量の文字列への使用には向いていない。

 

 

関連記事

過去の記事:

知らないと損するお金の話(ふるさと納税、確定申告とワンストップ納税どっちが得?) - Project_OKI’s diary

C言語基礎知識6(関数) - Project_OKI’s diary

C言語基礎知識7(構造体1) - Project_OKI’s diary

C言語基礎知識8(enum:列挙型) - Project_OKI’s diary

C言語基礎知識9(typedef) - Project_OKI’s diary

C言語基礎知識10(extern宣言) - Project_OKI’s diary

C言語基礎知識11(#define) - Project_OKI’s diary

 

組み込みC言語