数値(変数)を文字列に変換する
この記事では、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関数は、大量の文字列への使用には向いていない。
関連記事
C言語:
・組み込みの為のC言語基礎知識1(printf) - Project_OKI’s diary
・C言語基礎知識2(for分で処理を繰り返す) - Project_OKI’s diary
・C言語基礎知識3(配列) - Project_OKI’s diary
・知らないと損するお金の話(ふるさと納税、確定申告とワンストップ納税どっちが得?) - 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