字符串转换成整数

题目描述

输入一个由数字组成的字符串,把它转换成整数并输出。例如:输入字符串"123",输出整数123。

给定函数原型int StrToInt(const char *str) ,实现字符串转换成整数的功能,不能使用库函数atoi。

分析与解法

基本思路为:从左至右扫描字符串,把之前得到的数乘以10,然后加上当前字符所表示的数字。

然而,我们需要考虑以下几个问题:

  1. 输入为空指针时
  2. 数字前面的正负号
  3. 非法的字符
  4. 整形溢出

前三个问题很容易解决,这里主要考虑整形溢出的问题。一般来说,当发生溢出时,返回最大或最小的int值。我们先设置几个变量:

  • sign 用来表示数字的正负
  • n用来存放转化后的结果
  • c用来表示当前的数字

为了判断给定的数字转换后是否超出int所能表示的最大值,我们比较n 和 MAX_INT / 10的大小 ,即:

  • 若n > MAX_INT / 10, 那么说明在最后进行转换时,n * 10 必然大于 MAN_INT,所以此时直接返回MAX_INT
  • 若n == MAX_INT / 10,那么比较最后一个数字c和MAX_INT % 10的大小,如果 c > MAX_INT % 10,则返回MAX_INT

完整代码如下:


int StrToInt(const char* str)

{

static const int MAX_INT = (int)((unsigned)~0 >> 1);

static const int MIN_INT = -(int)((unsigned)~0 >> 1) - 1;

unsigned int n = 0;

?

//判断是否输入为空

if (str == 0)

{

return 0;

}

?

//处理空格

while (isspace(*str))

++str;

?

//处理正负

int sign = 1;

if (*str == ‘+‘ || *str == ‘-‘)

{

if (*str == ‘-‘)

sign = -1;

++str;

}

?

//确定是数字后才执行循环

while (isdigit(*str))

{

//处理溢出

int c = *str - ‘0‘;

if (sign > 0 && (n > MAX_INT / 10 || (n == MAX_INT / 10 && c > MAX_INT % 10)))

{

n = MAX_INT;

break;

}

else if (sign < 0 && (n >(unsigned)MIN_INT / 10 || (n == (unsigned)MIN_INT / 10 && c > (unsigned)MIN_INT % 10)))

{

n = MIN_INT;

break;

}

?

//把之前得到的数字乘以10,再加上当前字符表示的数字。

n = n * 10 + c;

++str;

}

return sign > 0 ? n : -n;

}

举一反三

  1. 实现string到double的转换
时间: 2024-08-03 19:23:23

字符串转换成整数的相关文章

剑指offer之【把字符串转换成整数】

题目: 把字符串转换成整数 链接: https://www.nowcoder.com/practice/1277c681251b4372bdef344468e4f26e?tpId=13&tqId=11202&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0

程序员面试50题(4)—把字符串转换成整数[算法]

题目:输入一个表示整数的字符串,把该字符串转换成整数并输出.例如输入字符串"345",则输出整数345. 分析:这道题尽管不是很难,学过C/C++语言一般都能实现基本功能,但不同程序员就这道题写出的代码有很大区别,可以说这道题能够很好地反应出程序员的思维和编程习惯,因此已经被包括微软在内的多家公司用作面试题.建议读者在往下看之前自己先编写代码,再比较自己写的代码和下面的参考代码有哪些不同. 首先我们分析如何完成基本功能,即如何把表示整数的字符串正确地转换成整数.还是以"345

C语言将一个字符串转换成整数

1.环境 ubuntu16.04 Eclipse C语言 2.问题 用C语言编写程序,将一个字符串转换成整数. 3.解决方法 程序代码:https://github.com/southeast02/JZOF/blob/master/chap01_page12_1.c

[算法练习] 把字符串转换成整数

题目说明: 输入一个表示整数的字符串,把该字符串转换成整数并输出.例如输入字符串"345",则输出整数345. 程序代码: #include <gtest/gtest.h> using namespace std; int StrToInt(const char* szValue, int nBase = 0, bool* bValid = NULL) { long long nValue = 0; int nSign = 1; if (bValid) { *bValid

[Leetcode] String to integer atoi 字符串转换成整数

Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases. Notes: It is intended for this problem to be spe

17.把字符串转换成整数atoi

http://zhedahht.blog.163.com/blog/static/25411174200731139971/ 代码如下: bool bValid = true; int str2int_core(const char *digit,bool minus) { long long sum = 0; int flag = minus ? -1:1; while(*digit!='\0') { if (*digit>='0'&&*digit<='9') { sum =

《剑指offer》第六十三题(把字符串转换成整数)

// 面试题67:把字符串转换成整数 // 题目:请你写一个函数StrToInt,实现把字符串转换成整数这个功能.当然,不 // 能使用atoi或者其他类似的库函数. #include <iostream> long long StrToIntCore(const char* str, bool minus); enum Status { kValid = 0, kInvalid }; int g_nStatus = kValid;//设置全局错误变量,用来反映无效输入 int StrToIn

算法实战(八)字符串转换成整数

一.前言 这个题和第七题的类型有点相似,不过这个题目涉及到了一些字符串的处理,由于比较简单,加上在加班的时候,把活干完了,没啥事情可以做了,所以我干脆把这个题目也一起做了. 二.题目 题目:请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号:假如第一个非空字符是数字,则直接将其与之后连续的数字字符组

剑指Offer对答如流系列 - 把字符串转换成整数

面试题67:把字符串转换成整数 题目描述 请你写一个函数StrToInt,实现把字符串转换成整数这个功能.当然,不能使用库函数. 问题分析 既然不能使用库函数,那么我们就利用字符的ASCII值,将字符转换成数字,并进行累加. 问题解答 // 标识输入非法 boolean isValid = false; public int strToInt(String str) { if(str == null || str.length()<=0) { return 0; } char[] chars =