秋季面试准备(1)——atoi的实现以及C++库函数stringstream

  记得去年9月28日赶到交大去听july的算法面试讲座,他给我们出的第一个题目就是用代码实现atoi,限时10mins。由于当时很久没接触编程,当堂没写出来。记得当时讲解的时候就是要我们特别注意边界条件。写程序就像砌围墙,得先把边界条件弄好。转眼一年过去了,再过几个月就要出去hunting job了,现在回顾下atoi这个函数。

  

 1 //判断字符是否是空格等特殊转义字符,这些输入没有显式输入
 2 isspace(int x)
 3 {
 4     if(x==‘ ‘||x==‘/t‘||x==‘/n‘||x==‘/f‘||x==‘/b‘||x==‘/r‘)
 5         return 1;
 6     else
 7         return 0;
 8 }
 9 //判断是否是数字,过滤掉其他字符如字母,@等符号
10 isdigit(int x)
11 {
12     if(x<=‘9‘&&x>=‘0‘)
13         return 1;
14     else
15         return 0;
16
17 }
18
19 //atoi的实现
20 int atoi(const char *nptr)
21 {
22         int c;              /* current char */
23         int total;         /* current total */
24         int sign;           /* if ‘-‘, then negative, otherwise positive */
25
26
27         /* skip whitespace */
28         while ( isspace((int)(unsigned char)*nptr) )
29             ++nptr;
30
31         //处理正负符号
32         c = (int)(unsigned char)*nptr;
33         sign = c;           /* save sign indication */
34         if (c == ‘-‘ || c == ‘+‘)
35             c = (int)(unsigned char)*nptr++;    //遇到正负号则从下一位开始转换
36
37
38         total = 0;
39         while (isdigit(c)) {
40             total = 10 * total + (c - ‘0‘);     /* accumulate digit */
41             c = (int)(unsigned char)*nptr++;    /* get next char */
42         }
43
44         //负数情况
45         if (sign == ‘-‘)
46             return -total;
47         else
48             return total;   /* return result, negated if necessary */
49 }
50  

这个函数考察的还是对临界条件的判断,整个代码处理字符串到整型数字的转换只有4行(38-42),其余代码都在处理异常情况。

百度了下,很多IT公司面试算法的第一题都是这个函数,足见其重要性。

PS:扩展(以下内容来源http://www.cppblog.com/Sandywin/archive/2007/07/13/27984.html)

C++中string to int的函数stringstream

头文件<sstream>

e.g:

string result=”10000”;
int n=0;
stream<<result;
stream>>n;//n等于10000

重复利用stringstream对象

如果你打算在多次转换中使用同一个stringstream对象,记住再每次转换前要使用clear()方法;

在多次转换中重复使用同一个stringstream(而不是每次都创建一个新的对象)对象最大的好处在于效率。stringstream对象的构造和析构函数通常是非常耗费CPU时间的。

在类型转换中使用模板

你可以轻松地定义函数模板来将一个任意的类型转换到特定的目标类型。例如,需要将各种数字值,如int、long、double等等转换成字符串,要使用以一个string类型和一个任意值t为参数的to_string()函数。to_string()函数将t转换为字符串并写入result中。使用str()成员函数来获取流内部缓冲的一份拷贝:

 1 template<class T>
 2
 3 void to_string(string & result,const T& t)
 4
 5 {
 6
 7  ostringstream oss;//创建一个流
 8
 9 oss<<t;//把值传递如流中
10
11 result=oss.str();//获取转换后的字符转并将其写入result
12 }

这样,你就可以轻松地将多种数值转换成字符串了:

to_string(s1,10.5);//double到string

to_string(s2,123);//int到string

to_string(s3,true);//bool到string

可以更进一步定义一个通用的转换模板,用于任意类型之间的转换。函数模板convert()含有两个模板参数out_type和in_value,功能是将in_value值转换成out_type类型:

 1 template<class out_type,class in_value>
 2
 3 out_type convert(const in_value & t)
 4
 5 {
 6
 7 stringstream stream;
 8
 9 stream<<t;//向流中传值
10
11 out_type result;//这里存储转换结果
12
13 stream>>result;//向result中写入值
14
15 return result;
16
17 }

这样使用convert():

double d;

string salary;

string s=”12.56”;

d=convert<double>(s);//d等于12.56

salary=convert<string>(9000.0);//salary等于”9000”

注意:在进行多次转换的时候,必须调用stringstream的成员函数clear()和str("");

#include <sstream>
#include <iostream>
int main()
{
    std::stringstream stream;
    int first, second;
    stream<< "456"; //插入字符串
    stream >> first; //转换成int
    std::cout << first << std::endl;
    //在进行多次转换前,必须清除stream
    stream.clear();//清除错误标志
    stream.str("");//清除内容“456”
    stream << true; //插入bool值
    stream >> second; //提取出int
    std::cout << second << std::endl;
} 

秋季面试准备(1)——atoi的实现以及C++库函数stringstream,布布扣,bubuko.com

时间: 2024-12-18 00:10:35

秋季面试准备(1)——atoi的实现以及C++库函数stringstream的相关文章

有趣的atoi()函数

atoi()函数是C语言库中的一个比较有意思的函数,有趣的地方在于,他可以将数字字符串转化为相应的数字,当然我们也可以通过字符间换算转化为相应数字,但有库函数atoi()使得代码简化许多.那么atoi()怎么用呢? 1.在c语言中直接包含在头文件stdlib.h头文件中,atoi()的形式参数为指针,所以要将字符串指针来传递.注意当atoi()读取到非数字字符时将会停止转换. 2.直接将string类型的字符串用char型指针进行指向即可.同样要包含头文件stdlib.h 3.c++中atoi函

atoi函数和std::stoi函数的不同点

atoi函数和std::stoi函数的不同点 出处不同 atoi()函数是C标准库函数,头文件为#include<stdlib.h>.同类型函数还包括atol(),atof(),strtol(),strtof()等: std::stoi()函数是C++11开始加入的STL标准模版库的函数,头文件为#include<string>.同类型函数还有std::stol(),std::stoll(): 功能不同 atoi() 会跳过前面的空白字符(包括空格,tab符号等),直到遇到第一个非

数字转字符串及字符串转数字

头文件:#include<cstdio> 1.字符串数字之间的转换 (1)string --> char *   string str("OK");   char * p = str.c_str(); (2)char * -->string   char *p = "OK";   string str(p); (3)char * -->CString    char *p ="OK";   CString m_Str

C++中数字与字符串之间的转换

1.字符串数字之间的转换 (1)string --> char *   string str("OK");   char * p = str.c_str(); (2)char * -->string   char *p = "OK";   string str(p); (3)char * -->CString    char *p ="OK";   CString m_Str(p);   //或者   CString m_Str

C++中数字和字符串的转换

1.字符串数字之间的转换 (1)string --> char *   string str("OK");   char * p = str.c_str(); (2)char * -->string   char *p = "OK";   string str(p); (3)char * -->CString    char *p ="OK";   CString m_Str(p);   //或者   CString m_Str

C++字符串类型和数字之间的转换

转载:http://www.cnblogs.com/luxiaoxun/archive/2012/08/03/2621803.html 1.字符串数字之间的转换 字符串---字符数组(1)string --> char *   string str("OK");   char * p = str.c_str(); 字符数组---字符串(2)char * -->string   char *p = "OK";   string str(p); 字符数组--

C/C++ 字符串与数字相互转换

一.利用stringstream类 1. 字符串到整数 stringstream sstr(str); int x; sstr >> x;(即从sstr中提取数据)2. 整数到字符串 stringstream sstr; int x; sstr << x; string str = sstr.str(); 缺点:处理大量数据转换速度较慢.stringstream不会主动释放内存,如果要在程序中用同一个流,需要适时地清除一下缓存(用stream.str("")和s

C语言---类型转换

itoa 功 能:把一整数转换为字符串 用 法:char *itoa(int value, char *string, int radix); 详细解释:itoa是英文integer to array(将int整型数转化为一个字符串,并将值保存在数组string中)的缩写. 参数: value: 待转化的整数. radix: 是基数的意思,即先将value转化为radix进制的数,范围介于2-36,比如10表示10进制,16表示16进制. * string: 保存转换后得到的字符串. 返回值:

【转】c/c++各种字符、字符串类型转换

itoa 功 能:把一整数转换为字符串 用 法:char *itoa(int value, char *string, int radix); 详细解释:itoa是英文integer to array(将int整型数转化为一个字符串,并将值保存在数组string中)的缩写. 参数: value: 待转化的整数. radix: 是基数的意思,即先将value转化为radix进制的数,范围介于2-36,比如10表示10进制,16表示16进制. * string: 保存转换后得到的字符串. 返回值: