人工知性を作りたい

私が日々、挑戦したことや学んだことなどを紹介していく雑記ブログです。 (新しいAI技術HTM, 専門の音声信号処理, 趣味のアニメ等も書いてます。)

文字列を数値に変換 -自作【C言語 】 (string to number)

f:id:hiro-htm877:20190601191549p:plain

 

f:id:hiro-htm877:20190601202549p:plain

「文字列を数値に変換したい!」

「コード書くのめんどくさいからコピペしたい!」

 

 

 

そんな方の疑問に答えます。

 

コードが知りたい方は目次のソースコードへ飛んでください!

本記事のテーマ

・文字列を数値に変換!

・コードをコピペするだけで使える!

文字列を数値に変換!

条件

・'0'〜'999999999'までの文字列に対応

・正の整数のみを変換する

・先頭の文字が'0'の場合、'0'以下の数字を表示する

アルゴリズム

文字列を数値に変換

1. 入力文字列を配列で宣言、関数にはアドレスを渡し、ポインタとして扱う

2. ポインタを++しながら、一文字づつを確認する

3. swich文で'0'〜'9'を数字に変換し、変数に加算

4. 変数を10倍する

5. 2〜4を文字列の最後まで繰り返す!

また、

・文字列の最後には終端文字としてNULL文字が入っている

 以上のアルゴリズムを元にC言語プログラミングを組んでいきます!

文字列を数値に変換、実装!

変換方法は、 

1.  while(*src_p != NULL)

 ←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);
}