演習 11-10

#include <stdio.h>

int strtoi(const char *nptr){

    int num = 0, sign = 1;

    if(*nptr == '+'){
        sign = 1;
        *nptr++;
    }else if(*nptr == '-'){
        sign = -1;
        *nptr++;
    }

    while(true){
        num += *nptr - '0';
        *nptr++;
        if(*nptr == '\0') break;
        num *= 10;
    }

    return num * sign;
}

long strtol(const char *nptr){
   
    int sign = 1;
    long num = 0;

    if(*nptr == '+'){
        sign = 1;
        *nptr++;
    }else if(*nptr == '-'){
        sign = -1;
        *nptr++;
    }

    while(true){
        num += *nptr - '0';
        *nptr++;
        if(*nptr == '\0') break;
        num *= 10;
    }

    return num * sign;
}

double strtof(const char *nptr){
   
    int sign = 1;
    double num = 0;

    // 符号の処理
    if(*nptr == '+'){
        sign = 1;
        *nptr++;
    }else if(*nptr == '-'){
        sign = -1;
        *nptr++;
    }

    // 整数部の処理
    while(true){
        num += *nptr - '0';
        *nptr++;
        if(*nptr == '\0' || *nptr == '.') break;
        num *= 10;
    }

    // 小数部の処理
    if(*nptr == '.'){
        *nptr++;
        double dec = 1;
        while(true){
            num += (*nptr - '0') / (dec *= 10);
            *nptr++;
            if(*nptr == '\0') break;
        }
    }

    return num * sign;
}

int main(){

    char str1[256] = "12345";
    char str2[256] = "123.45";

    printf("str1:%s -> atoi(str1):%d\n", str1, strtoi(str1));
    printf("str1:%s -> atol(str1):%ld\n", str1, strtol(str1));
    printf("str2:%s -> atof(str2):%lf\n", str2, strtof(str2));

    return 0;
}

2 件のコメント:

  1. このようなエラー文はどのように対処したら良いのでしょうか?

    16: error: ‘true’ undeclared (first use in this function)
    16: error: (Each undeclared identifier is reported only once
    16: error: for each function it appears in.)
    64: error: ‘true’ undeclared (first use in this function)
    39: error: ‘true’ undeclared (first use in this function)

    返信削除
    返信
    1. すいません...Cではtrue/falseは使えませんでしたね...
      解決策の一つはファイルの拡張子を.cから.cppにすることで, もう一つの解決策はtrueを1と置き換えることになります.

      削除