将字符串转换成double或者int的实现(c programming language)

直接上代码:

/*
 * =====================================================================================
 *
 *       Filename:  atof.cpp
 *
 *    Description:  
 *
 *        Version:  1.0
 *        Created:  2012年12月31日 14时39分22秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Weidong Yang (cn), [email protected]
 *        Company:  
 *
 * =====================================================================================
 */

#include <cstdio>
#include <ctype.h> //use for isdigit(),isspace()
#include <cmath>

/* atof:covert string s to double */
double atof(char s[])
{
    double val;
    int i,v_pow,sign,e_sign,e_pow;

    for (i = 0; isspace(s[i]); i++) // skip the white space
        ;
    sign = (s[i] == '-') ? -1 : 1;
    if (s[i] == '-' || s[i] == '+')
        i++;
    for (val = 0; isdigit(s[i]); i++)
        val = val * 10 + (s[i] - '0');
    if (s[i] == '.')
        i++;
    for (v_pow = 1; isdigit(s[i]); i++)
    {
        val = val * 10 + (s[i] - '0');
        v_pow *= 10;
    }
    if (s[i] == 'e' || s[i] == 'E') // handle scientific notation
        i++;
    e_sign = (s[i] == '-') ? -1 : 1;
    if (s[i] == '-' || s[i] == '+')
        i++;
    for (e_pow = 0; isdigit(s[i]); i++)
        e_pow = e_pow * 10 + (s[i] - '0');
    e_pow *= e_sign;
    return sign * (val * pow(10, (double)e_pow)) / v_pow;
}

double atoi(char s[])
{
    return (int)atof(s);
}

int main()
{
    char s[] = "-45.67e-100";
    double d = atof(s);
    printf("%g\n", d);
    char ss[] = "-45e4";
    int i = atoi(ss);
    printf("%d\n", i);
    return 0;
}

-----------------------------------------------------分割线-----------------------------------------------------------------------------------------

下面的内容转载自http://ilovers.sinaapp.com/drupal/node/62

将字符串转化为整数( maybe 浮点数?)是一个灰常基本的需求,基本到只要是涉及到数字的实际应用,都会有用到。然而这么一个转换程序并没有想象的那么简单,不过不用担心,几乎所有的语言库都有提供转化,比如 C 语言中就有个 atoi 函数。现在的问题是,如果让 me 们写一个,会是神马样纸?

初级版本:

  1. int strtoi ( const  char  *s )
  2. {
  3.      int num  =  0 ;
  4.  
  5.      while ( *s ) {
  6.         num  = num * 10 +*s - '0' ;
  7.          ++s ;
  8.      }
  9.      return num ;
  10. }

上面的小程序,okay,基本满足了需求,给一个 "1234",函数 strtoi 返回 1234。but,作为一个库或是模块使用的话,其中有若干个 bug。

问题所在:

  1. 输入的字符串可能是 NULL;
  2. 输入的字符串中可能含有其他字符,比如 'a';
  3. 输入的字符串中可能存在正负号;
  4. 输入的字符串中的整数可能超出了 int 的取值范围;

第一个问题和第二个问题容易解决,加些判断条件过滤一下基本就 ok;第三个,也不难,根据首字符判断正负号;关键是第四个问题。神马时候会溢出?溢出后是个神马情况?两个正数相加会溢出,结果为负数;两个负数相加会溢出,结果为正数或是0!来验证一下结论,墙上的钟表,0点到11点,如果看成是整数的话,是0-11,如果换成有符号数,应该是0到5,-6到-1;me 们做做加法(加1向右数,减1向左数,0 的左端是 -1,-1 的右端是0)。

溢出分析:

// 0  1  2  3  4  5   6   7   8   9  10  11
// 0  1  2  3  4  5  -6  -5  -4  -3  -2  -1

 5 + 5 = 10  = -2    // 正+正=负
-5 +-5 = -10 = 2    // 负+负=正
-6 +-6 = -12 = 0    // 负+负=0

// 正+负 = 负+正,结果不可能溢出,因为结果应该介于相加的正数和负数之间
// 正+正 溢出后的结果不可能是正,最好的溢出情况是1+5=-6,最坏的溢出情况是5+5=-2,溢出的结果应该在 -6和-2之间
// 负+负 溢出后的结果不可能为负,最坏的溢出情况是 -6 + -6 = 0,最好的溢出情况是 -1 + -6 = 5,溢出后的结果应该在0和5之间
// 数+0 = 0+数,这个简单,不会溢出
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这个问题我会尽力回答。以下是函数模板bubble和字符串类型的特化版本bubble的定义,以及STUDENT类的定义和重载"<"运算符的代码: ```c++ #include<iostream> #include<string> using namespace std; // STUDENT类的定义 class STUDENT{ public: string id; // 学号 string name; // 姓名 int age; // 年龄 string department; // 系别 // 重载<运算符,用来比较两个对象的大小 bool operator<(const STUDENT& s){ return id < s.id; } }; // 声明一个函数模板bubble,用来处理基本数据类型int、float、double、char、STUDENT template<class TYPE> void bubble(TYPE A[], int len); // 定义bubble的特殊版本,用来处理字符串类型 template<> void bubble(char* Strs[], int len); // bubble函数模板的定义 template<class TYPE> void bubble(TYPE A[], int len){ for(int i=0; i<len-1; i++){ for(int j=0; j<len-i-1; j++){ if(A[j] > A[j+1]){ swap(A[j], A[j+1]); } } } // 打印排序后的数组 for(int i=0; i<len; i++){ cout << A[i] << " "; } cout << endl; } // bubble函数模板的字符串类型特化版本的定义 template<> void bubble(char* Strs[], int len){ for(int i=0; i<len-1; i++){ for(int j=0; j<len-i-1; j++){ if(strcmp(Strs[j], Strs[j+1]) > 0){ swap(Strs[j], Strs[j+1]); } } } // 打印排序后的字符串数组 for(int i=0; i<len; i++){ cout << Strs[i] << " "; } cout << endl; } int main(){ // 测试bubble函数模板 int intArr[] = {4, 2, 1, 5, 3}; bubble(intArr, 5); float floatArr[] = {3.2, 1.5, 4.6, 2.0, 5.1}; bubble(floatArr, 5); double doubleArr[] = {5.6, 2.3, 4.1, 1.7, 3.9}; bubble(doubleArr, 5); char charArr[] = {'d', 'f', 'a', 'c', 'e', 'b'}; bubble(charArr, 6); STUDENT stuArr[] = {{"20210001", "张三", 20, "计算机科学与技术"}, {"20210003", "李四", 22, "数学与应用数学"}, {"20210002", "王五", 21, "软件工程"}}; bubble(stuArr, 3); // 测试bubble函数模板的特化版本 char* strArr[] = {"hello", "world", "C++", "programming", "language"}; bubble(strArr, 5); return 0; } ``` 注意:在这里,我们使用了std::string类型来定义STUDENT类中的学号、姓名和系别等信息。同时,需要在STUDENT类定义中重载"<"运算符,才能够使用STUDENT类类型作为bubble函数模板的参数类型。 希望我的回答能够帮助到你,如果你还有任何问题,欢迎随时向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值