「文字列を数値に変換したい!」
「コード書くのめんどくさいからコピペしたい!」
そんな方の疑問に答えます。
コードが知りたい方は目次のソースコードへ飛んでください!
本記事のテーマ
・文字列を数値に変換!
・コードをコピペするだけで使える!
文字列を数値に変換!
条件
・'0'〜'999999999'までの文字列に対応
・正の整数のみを変換する
・先頭の文字が'0'の場合、'0'以下の数字を表示する
アルゴリズム
文字列を数値に変換
1. 入力文字列を配列で宣言、関数にはアドレスを渡し、ポインタとして扱う
2. ポインタを++しながら、一文字づつを確認する
3. swich文で'0'〜'9'を数字に変換し、変数に加算
4. 変数を10倍する
5. 2〜4を文字列の最後まで繰り返す!
また、
・文字列の最後には終端文字としてNULL文字が入っている
以上のアルゴリズムを元にC言語プログラミングを組んでいきます!
文字列を数値に変換、実装!
変換方法は、
←src_pの終端文字がNULLになるまで実行
2. switch (*src_p)
←文字から数値に変換して加算
3. num = (num << 1) + (num << 3);
←10倍する
4. num /= 10;
←最後に10分の1して終了
文字列→数値変換操作コード
文字列にはアドレス一つにつき一文字が格納されており、終端にはNULL文字が入っています。ですので、アドレスを一つずつ進め、中の値を変換していきます。
ポインタの扱い方:
*src_p: *をつけるとポインタの中の値を操作できる
src_p++: ポインタのアドレスを一つ進める
unsigned long int str2num(char* src_p){
unsigned long int num = 0;
while(*src_p != NULL){
switch (*src_p) {
case '0':
break;
case '1':
num += 1;
break;
case '2':
num += 2;
break;
case '3':
num += 3;
break;
case '4':
num += 4;
break;
case '5':
num += 5;
break;
case '6':
num += 6;
break;
case '7':
num += 7;
break;
case '8':
num += 8;
break;
case '9':
num += 9;
break;
default:
break;
}
num = (num << 1) + (num << 3);
printf("num: %lu\n", num);
src_p++;
}
num /= 10;
printf("num: %lu\n", num);
return num;
}
出力
01234056789
num: 0
num: 10
num: 120
num: 1230
num: 12340
num: 123400
num: 1234050
num: 12340560
num: 123405670
num: 1234056780
num: 12340567890
num: 1234056789
完成です!
今回は正の整数のみを実装しました。少数は加算して10で割れば実現できると思います。ぜひ試してみてください!
main文を含む全ソースコードは以下に示します。
ソースコード
#include <stdio.h>
void enshu0608(void);
unsigned long int str2num(char* src_p);
int main() {
enshu0606();
return 0;
}
unsigned long int str2num(char* src_p){
unsigned long int num = 0;
while(*src_p != NULL){
//printf("%c\n", *src_p);
switch (*src_p) {
case '0':
break;
case '1':
num += 1;
break;
case '2':
num += 2;
break;
case '3':
num += 3;
break;
case '4':
num += 4;
break;
case '5':
num += 5;
break;
case '6':
num += 6;
break;
case '7':
num += 7;
break;
case '8':
num += 8;
break;
case '9':
num += 9;
break;
default:
break;
}
num = (num << 1) + (num << 3);
printf("num: %lu\n", num);
src_p++;
}
num /= 10;
printf("num: %lu\n", num);
return num;
}
void enshu0608(void){
char src[] = "01234056789";
unsigned long int num=0;
printf("%s\n", src);
num =str2num(&src);
}