[C言語] 文字列と数値を相互に変換し合う方法を解説
C言語では、文字列と数値を相互に変換するために標準ライブラリの関数を利用します。
数値を文字列に変換するには、sprintf
関数を使用します。この関数は、数値を指定したフォーマットで文字列に変換し、バッファに格納します。
逆に、文字列を数値に変換するには、atoi
やatof
、strtol
、strtod
などの関数を使用します。これらの関数は、文字列を整数や浮動小数点数に変換します。
これらの関数を適切に使用することで、文字列と数値の間での変換が容易になります。
- 文字列から数値への変換方法とエラーハンドリング
- 数値から文字列への変換方法とフォーマット指定
- 文字列と数値変換の実践的な応用例
- 変換時に注意すべきポイントと精度の保ち方
文字列から数値への変換
C言語では、文字列を数値に変換するためのさまざまな関数が用意されています。
これらの関数を使うことで、ユーザー入力やファイルから読み込んだデータを数値として扱うことができます。
以下に、代表的な関数の使い方を解説します。
atoi関数の使い方
atoi関数
は、文字列を整数に変換するための関数です。
標準ライブラリのstdlib.h
に含まれています。
#include <stdio.h>
#include <stdlib.h>
int main() {
// 文字列を整数に変換
char str[] = "123";
int num = atoi(str);
printf("変換された整数: %d\n", num);
return 0;
}
変換された整数: 123
atoi関数
は、文字列の先頭から数字を読み取り、整数に変換します。
ただし、エラー処理がないため、無効な文字列を渡すと予期しない結果になることがあります。
atof関数の使い方
atof関数
は、文字列を浮動小数点数に変換するための関数です。
こちらもstdlib.h
に含まれています。
#include <stdio.h>
#include <stdlib.h>
int main() {
// 文字列を浮動小数点数に変換
char str[] = "123.45";
double num = atof(str);
printf("変換された浮動小数点数: %f\n", num);
return 0;
}
変換された浮動小数点数: 123.450000
atof関数
は、文字列の先頭から数字を読み取り、浮動小数点数に変換します。
こちらもエラー処理がないため、無効な文字列を渡すと予期しない結果になることがあります。
strtol関数の使い方
strtol関数
は、文字列を長整数に変換するための関数で、基数を指定することができます。
stdlib.h
に含まれています。
#include <stdio.h>
#include <stdlib.h>
int main() {
// 文字列を長整数に変換
char str[] = "12345";
long num = strtol(str, NULL, 10);
printf("変換された長整数: %ld\n", num);
return 0;
}
変換された長整数: 12345
strtol関数
は、基数を指定することで、10進数以外の数値も変換することができます。
基数を指定した変換
strtol関数
では、基数を指定することで、16進数や8進数の文字列を変換することができます。
#include <stdio.h>
#include <stdlib.h>
int main() {
// 16進数文字列を長整数に変換
char hexStr[] = "1A3F";
long hexNum = strtol(hexStr, NULL, 16);
printf("16進数から変換された長整数: %ld\n", hexNum);
// 8進数文字列を長整数に変換
char octStr[] = "123";
long octNum = strtol(octStr, NULL, 8);
printf("8進数から変換された長整数: %ld\n", octNum);
return 0;
}
16進数から変換された長整数: 6719
8進数から変換された長整数: 83
基数を指定することで、異なる進数の文字列を正しく変換することができます。
strtod関数の使い方
strtod関数
は、文字列を倍精度浮動小数点数に変換するための関数です。
stdlib.h
に含まれています。
#include <stdio.h>
#include <stdlib.h>
int main() {
// 文字列を倍精度浮動小数点数に変換
char str[] = "123.456";
double num = strtod(str, NULL);
printf("変換された倍精度浮動小数点数: %f\n", num);
return 0;
}
変換された倍精度浮動小数点数: 123.456000
strtod関数
は、atof関数
と異なり、エラー処理が可能です。
エラーハンドリングの方法
文字列から数値への変換では、無効な文字列が渡された場合にエラーを処理することが重要です。
strtol
やstrtod関数
では、エラーハンドリングが可能です。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main() {
// 無効な文字列を変換
char str[] = "abc";
char *endptr;
errno = 0; // エラー番号をリセット
long num = strtol(str, &endptr, 10);
if (errno != 0 || *endptr != '\0') {
printf("変換エラーが発生しました。\n");
} else {
printf("変換された数値: %ld\n", num);
}
return 0;
}
変換エラーが発生しました。
strtol
やstrtod関数
では、変換に失敗した場合にerrno
をチェックし、endptr
を使って変換が成功したかどうかを確認することができます。
これにより、無効な文字列が渡された場合でも適切にエラーを処理することができます。
数値から文字列への変換
数値を文字列に変換することは、データの表示やファイルへの書き込みなどでよく行われます。
C言語では、数値を文字列に変換するためのいくつかの関数が用意されています。
以下に、代表的な関数の使い方を解説します。
sprintf関数の使い方
sprintf関数
は、数値を文字列に変換し、指定したバッファに書き込むための関数です。
stdio.h
に含まれています。
#include <stdio.h>
int main() {
// 整数を文字列に変換
int num = 123;
char str[10];
sprintf(str, "%d", num);
printf("変換された文字列: %s\n", str);
return 0;
}
変換された文字列: 123
sprintf関数
は、フォーマット指定子を使って数値を文字列に変換します。
バッファのサイズに注意が必要です。
snprintf関数の使い方
snprintf関数
は、sprintf関数
と同様に数値を文字列に変換しますが、バッファのサイズを指定することができます。
これにより、バッファオーバーフローを防ぐことができます。
#include <stdio.h>
int main() {
// 浮動小数点数を文字列に変換
double num = 123.456;
char str[20];
snprintf(str, sizeof(str), "%.2f", num);
printf("変換された文字列: %s\n", str);
return 0;
}
変換された文字列: 123.46
snprintf関数
は、バッファのサイズを指定することで、安全に文字列を生成することができます。
itoa関数の使い方
itoa関数
は、整数を文字列に変換するための非標準関数です。
標準ライブラリには含まれていないため、使用する際は注意が必要です。
#include <stdio.h>
#include <stdlib.h>
int main() {
// 整数を文字列に変換
int num = 123;
char str[10];
itoa(num, str, 10);
printf("変換された文字列: %s\n", str);
return 0;
}
変換された文字列: 123
itoa関数
は、基数を指定して整数を文字列に変換します。
ただし、移植性に欠けるため、使用は推奨されません。
gcvt関数の使い方
gcvt関数
は、浮動小数点数を文字列に変換するための非標準関数です。
こちらも標準ライブラリには含まれていないため、使用する際は注意が必要です。
#include <stdio.h>
#include <stdlib.h>
int main() {
// 浮動小数点数を文字列に変換
double num = 123.456;
char str[20];
gcvt(num, 6, str);
printf("変換された文字列: %s\n", str);
return 0;
}
変換された文字列: 123.456
gcvt関数
は、指定した桁数で浮動小数点数を文字列に変換します。
こちらも移植性に欠けるため、使用は推奨されません。
変換時のフォーマット指定
数値を文字列に変換する際には、フォーマット指定子を使って出力形式を指定することができます。
以下に、よく使われるフォーマット指定子を示します。
フォーマット指定子 | 説明 |
---|---|
%d | 整数 |
%f | 浮動小数点数 |
%e | 指数表記の浮動小数点数 |
%x | 16進数 |
%o | 8進数 |
フォーマット指定子を使うことで、数値を希望する形式で文字列に変換することができます。
たとえば、%.2f
を使うと、小数点以下2桁までの浮動小数点数を文字列に変換できます。
文字列と数値変換の応用例
文字列と数値の変換は、さまざまな場面で応用されます。
ここでは、具体的な応用例をいくつか紹介します。
ユーザー入力の数値変換
ユーザーからの入力を数値として扱うためには、文字列を数値に変換する必要があります。
以下の例では、ユーザーから入力された文字列を整数に変換しています。
#include <stdio.h>
#include <stdlib.h>
int main() {
char input[10];
printf("整数を入力してください: ");
fgets(input, sizeof(input), stdin);
int num = atoi(input);
printf("入力された整数: %d\n", num);
return 0;
}
整数を入力してください: 42
入力された整数: 42
このように、ユーザーからの入力を数値に変換することで、計算や条件分岐に利用できます。
ファイルから読み込んだデータの変換
ファイルから読み込んだデータを数値として扱う場合も、文字列から数値への変換が必要です。
以下の例では、ファイルから読み込んだ文字列を整数に変換しています。
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *file = fopen("data.txt", "r");
if (file == NULL) {
perror("ファイルを開けませんでした");
return 1;
}
char buffer[10];
while (fgets(buffer, sizeof(buffer), file) != NULL) {
int num = atoi(buffer);
printf("読み込んだ整数: %d\n", num);
}
fclose(file);
return 0;
}
読み込んだ整数: 100
読み込んだ整数: 200
ファイルからのデータを数値に変換することで、データの集計や分析が可能になります。
数値データのフォーマット出力
数値を特定のフォーマットで出力することは、レポートやログの作成に役立ちます。
以下の例では、数値を通貨形式で出力しています。
#include <stdio.h>
int main() {
double price = 1234.567;
printf("価格: $%.2f\n", price);
return 0;
}
価格: $1234.57
フォーマット指定子を使うことで、数値を見やすい形式で出力することができます。
数値計算結果の文字列化
計算結果を文字列として保存したり表示したりする場合、数値を文字列に変換します。
以下の例では、計算結果を文字列に変換しています。
#include <stdio.h>
int main() {
int a = 5, b = 3;
int result = a + b;
char resultStr[10];
sprintf(resultStr, "%d", result);
printf("計算結果: %s\n", resultStr);
return 0;
}
計算結果: 8
計算結果を文字列に変換することで、他の文字列と結合したり、ファイルに保存したりすることができます。
データベースとのデータ交換
データベースとのデータ交換では、文字列と数値の変換が頻繁に行われます。
SQLクエリを作成する際に、数値を文字列に変換してクエリに組み込むことが一般的です。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int userId = 42;
char query[100];
snprintf(query, sizeof(query), "SELECT * FROM users WHERE id = %d;", userId);
printf("SQLクエリ: %s\n", query);
return 0;
}
SQLクエリ: SELECT * FROM users WHERE id = 42;
このように、数値を文字列に変換してSQLクエリを作成することで、データベースとのやり取りが可能になります。
よくある質問
まとめ
文字列と数値の変換は、C言語プログラミングにおいて頻繁に行われる操作です。
この記事では、文字列から数値への変換、数値から文字列への変換、そしてそれらの応用例について詳しく解説しました。
これらの知識を活用することで、プログラムの入力処理やデータの表示がより効果的に行えるようになります。
ぜひ、実際のプログラムでこれらの技術を試してみてください。