如何从java字符串转换成整数为整数问题,怎么解决

边界条件:
只有正负号
有无正负号
错误标志输出
class Solution {
enum Status{kValid = 0,kInvalid};
int g_nStatus = kV
int StrToInt(string str) {
g_nStatus = kI
long long num = 0;
const char* cstr = str.c_str();
if( (cstr != NULL) && (*cstr != '\0') )
int minus = 1;
if(*cstr == '-')
minus = -1;
else if(*cstr == '+')
while(*cstr != '\0')
if(*cstr & '0' && *cstr & '9')
g_nStatus = kV
num = num*10 + (*cstr -'0');
if( ((minus&0) && (num & 0x7FFFFFFF)) ||
((minus&0) && (num & 0x)) )
g_nStatus = kI
g_nStatus = kI
if(g_nStatus == kValid)
num = num *
return (int)
简单常用函数
class Solution {
int StrToInt(string str) {
int n = str.size(), s = 1;
long long res = 0;
if(!n) return 0;
if(str[0] == '-') s = -1;
for(int i = (str[0] ==
'-' || str[0] == '+') ? 1 : 0; i & ++i){
if(!('0' &= str[i] && str[i] &= '9')) return 0;
res = (res && 1) + (res && 3) + (str[i] & 0xf);//res=res*10+str[i]-'0';
return res *
public int StrToInt(String str)
if (str.equals(&&) || str.length() == 0)
char[] a = str.toCharArray();
int fuhao = 0;
if (a[0] == '-')
fuhao = 1;
int sum = 0;
for (int i = i & a. i++)
if (a[i] == '+')
if (a[i] & 48 || a[i] & 57)
sum = sum * 10 + a[i] - 48;
return fuhao == 0 ? sum : sum * -1;
你倒是给个规则啊,要不鬼知道怎么样转换?全部转为1可好?
class Solution {
int StrToInt(string str) {
if(str.empty())
int symbol = 1;
if(str[0] == '-'){//处理负号
symbol = -1;
str[0] = '0'; //这里是‘0’ 不是0
}else if(str[0] == '+'){//处理正号
symbol = 1;
str[0] = '0';
int sum = 0;
for(int i=0;i&str.size();++i){
if(str[i] & '0' || str[i] & '9'){
sum = sum *10 + str[i] - '0';
return symbol *
public class Solution {
public static int StrToInt(String str) {
//判断输入是否合法
if (str == null || str.trim().equals(&&)) {
// symbol=0,说明该数为正数;symbol=1,该数为负数;start用来区分第一位是否为符号位
int symbol = 0;
int start = 0;
char[] chars = str.trim().toCharArray();
if (chars[0] == '+') {
start = 1;
} else if (chars[0] == '-') {
start = 1;
symbol = 1;
int result = 0;
for (int i = i & chars. i++) {
if (chars[i] & '9' || chars[i] & '0') {
int sum= result * 10 + (int) (chars[i] - '0');
if((sum-(int) (chars[i] - '0'))/10!=result){
result=result * 10 + (int) (chars[i] - '0');
* 本人认为java热门第一判断是否溢出是错误的,举个反例
* 当输入为value=时,在计算机内部的表示应该是-
* 显然value&Integer.MAX_VALUE是不成立的
// 注意:java中-1的n次方不能用:(-1)^n .'^'异或运算
// 注意,当value=-时,value=-value
result = (int) Math.pow(-1, symbol) *
python solution # -*- coding:utf-8 -*-
class Solution:
def StrToInt(self, s):
# write code here
return int(s)
public class Solution {
//1.字符串为空
//2.只有一个正或负号
//3.整数上下溢出 Integer.MAX_VALUE (2^31-1)
Integer.MIN_VALUE(-2^31)
public int StrToInt(String str) {
if(str == null ||str.length()==0){
char[] c=str.toCharArray();
boolean minus =
int num = 0;
//数组溢出:下标大于数组长度!比如c.length ==1,当有c[1]出现时则数组溢出
if(c[i]=='+'){
}else if(c[i]=='-'){
if(i&c.length){
num = StrToIntCore(c,minus,i);
int StrToIntCore(char[] str,boolean minus,int i){
int num = 0;
for(int j =j&str.j++){
if(str[j]&='0'&&str[j]&='9'){
int flag = minus ? -1:1;
//str[j]-'0' 是为了把字符转为int数字
num = num*10 + flag*(str[j] - '0');
if((!minus&&num&Integer.MAX_VALUE)||(minus&&num&Integer.MIN_VALUE)){
class Solution {
int StrToInt(string str)
int m=str.length();
if(m==0) return 0;
int result=0,flag=1;
int index=str.find_first_not_of(' ');
if(str[index]=='+' || str[index]=='-')
flag = str[index++]=='-'? -1 : 1;
for(;index&m;index++)
if(str[index]&='0' && str[index]&='9')
result = result*10+(str[index]-'0');
if(result*flag & INT_MAX)
return INT_MAX;
if(result*flag & INT_MIN)
return INT_MIN;
result = 0;
return result*
//测试样例不全,leetcode上做了很久都不对。
//这里都不知道怎么写的居然对了。。。
class Solution {
int StrToInt(string str) {
long long ret = 0;
int sz = str.size();
bool flag =
for(int i = 0; i & ++i){
if(str[i]&='0' && str[i]&='9'){
ret = ret*10 + (str[i] - '0');
else if(str[i]=='-' && i==0){
else if((str[i]&'0' || str[i]&'9') && i!=0)
if(flag) ret = -
public class Solution {
public int StrToInt(String str) {
int res = 0;
int symbol = 1;
boolean isInvalid =
// 区分非法输入和0
char[] arr = str.toCharArray();
int n = arr.
0 || str == null) {
isInvalid =
if (arr[0] == '-')
symbol = -1;
for (int i = (arr[0] ==
'-' || arr[0] == '+') ? 1 : 0; i & ++i) {
if (!('0' &= arr[i] && arr[i] &= '9')) {
isInvalid =
res = (res && 1) + (res && 3) + (arr[i] & 0xf); //res=res*10+arr[i]-'0'
// 溢出判断
if((symbol == 1 && res&Integer.MAX_VALUE) || (symbol == -1 && res & Integer.MIN_VALUE)) {
isInvalid =
return res *
要点: 1. 异常输入和0输入的区分,设置一个全局变量
2. 正负号的处理
3. 溢出处理
其实非常简单,代码如下:
public int StrToInt(String str){
if(null==str||str.length()&1){
boolean negativeFlag=
char[]charArray=str.toCharArray();
if(charArray[0]=='-'){
negativeFlag=
int sum=0;
for(int i=0;i&charArray.++i){
if(i==0&&charArray[i]=='+'||charArray[i]=='-'){
if(charArray[i]&'0'||charArray[i]&'9'){
sum=sum*10+(charArray[i]-'0');
return negativeFlag?(0-sum):
public class Solution {
public int StrToInt(String str) {
if (str == null || &&.equals(str)) return 0;
int len = str.length();
if (len == 1 && !isNumChar(str.charAt(0))) return 0;
//保存数值对应的字符
char[] numChars = new char[len];
int res = 0;
int index = 0;
char sign = '+';//保存符号
boolean isValid =
for (int i = 0; i & i++) {
char c = str.charAt(i);
if (i == 0 && (c == '-' || c == '+')) {
if (isNumChar(c)) {
numChars[index++] =
if (!isValid) {
for (int i = 0; i & i++) {
res += (numChars[i] - '0') * pow(10, index - i - 1);
return sign == '-' ? 0 - res :
* 判断一个字符是否是数字
* @param c
private boolean isNumChar(char c) {
return c &= '0' && c &= '9';
private int pow(int base, int exp) {
return (int) Math.pow(base, exp);
1、首先有可能有正负号,也有可能没有
2、当输入字符串中有非数字的时候输出为0;
int StrToInt(string str)
bool g_InvalidValue =
if(str.size()&=0)
g_InvalidValue =
int i = 0;
int sum = 0;
bool isPositive =
if(str[i]=='-')
isPositive =
else if(str[i]=='+')
while(str[i])
if(str[i]&='9'&&str[i]&='0')
sum = sum*10+str[i]-'0'+0;
g_InvalidValue =
if(isPositive)
/*1、设置输入合法标志,默认为false,当第一个字符为空或者\0的时候直接诶返回0,输入合法标志为false。反之进入下一步
2、设置符号位,判断是+还是-还是不带符号位,只有为-才置为true,否则均为false。
3、区分除了符号位之外第一位时候合法输入。非法时返回0,输入合法位为false。合法时判断有无越界,若越界返回0,输入
合法位为false,无越界计算num返回,输入合法位为true。
总结:只有在顺利走到字符串尾部的时候输入合法标志位才为true,其余情况均为false。这样就能区分开返回0时究竟是非法
输入还是确实输入的就是0。只有一个+号或-号也被考虑进来了,直接返回0且输入合法标志位为false。
class Solution {
enum Status{kValid = 0,kInvalid};
int g_nStatus = kV
int StrToInt(string str) {
g_nStatus = kI
long long num = 0;
int index=0;
if((!str.empty())&&str[index]!='\0')
bool minus =
if(str[index]=='+')
else if(str[index]=='-')
if(str[index]!='\0')
int length=str.size();
num = StrToIntCore(str.substr(index,length-index),minus);
return (int)
long long StrToIntCore(const string& digit,bool minus)
long long num=0;
while(digit[i]!='\0')
{ //合法情况
//if(digit[i]=='+'||digit[i]=='-')
if(digit[i]&='0'&&digit[i]&='9')
int flag = minus?-1:1;
num = num*10+ flag*(digit[i]-'0');
//越界情况
if((!minus&&num&0x7FFFFFFF)||(minus&&num&(signed int)0x))
else//非法情况
if(digit[i]=='\0')
g_nStatus = kV
public class Solution {
int StrToInt(String str) {
if(str == && || str == null)
char[] chars = str.toCharArray();
int length = chars.
boolean negative =
int limit = -Integer.MAX_VALUE;
int i = 0;
int digit, multM
int result = 0;
if(length & 0){
char firstChar = chars[0];
if(firstChar & '0'){ //may be '+' or '-'
if(firstChar == '-'){
negative =
limit = Integer.MIN_VALUE;
}else if(firstChar != '+'){
if(length == 1) //only '+'
multMin = limit / 10;
while(i & length){
digit = Character.digit(chars[i++], 10);
if(digit & 0)
if(result & multMin){
result *= 10;
if(result & limit + digit){ //digit必须放在不等式右侧防止左侧溢出,判断防止最终溢出
return negative? result : -
public int StrToInt(String str) {
if(str.isEmpty()) {
char[] chars = str.toCharArray();
int sum = 0;
int sign = 0;
if(chars[0] == '-') {
sign = -1;
}else if(chars[0] == '+') {
sum = (int) ((chars[0] - 48) * Math.pow(10, chars.length-1));
for(int i = 1;i & chars.i++){
if(chars[i] & '1' || chars[i] & '9') {
sum += (int)((chars[i] - 48) * Math.pow(10, chars.length-i-1));
if(sign != 0) {
比较笨的方法
我感觉他给的参考答案有点问题,比如连续多个负号的情况public class Solution {
public class Solution {
public int StrToInt(String str) {
if(str.equals(&&)||str.length()==0){ return 0;}
char []strings=str.toCharArray();
int fuhao=0;
if(strings[0]=='-'){
int sum=0;
for(int i=i&str.length();i++){
if (strings[i] == '+')
if(strings[i]=='-'){
if(fuhao==1){
else if(strings[i]&48||strings[i]&57){
sum=sum*10+(strings[i]-48);
return fuhao==0?sum:sum*(-1);
class Solution { public:
int StrToInt(string str) {
int res = 0;
bool pos =
for (char c:str){
if (c=='+')
else if (c=='-'){
int tmp = c-'0';
if (tmp&=0&&tmp&10) res = res*10+
else return 0;
if (!pos) return -
// 1、先用正则过滤基本数字结构
// 2、设置标志量判断正数还是负数
// 3、相加即可【注意精度可能缺失导致测试无法通过的问题】
public class Solution {
public static int StrToInt(String str) {
String regex = &([+]|-){0,1}\\d*&;
if(str.equals(&0&)||&&.equals(str)||str == null||str.length()&=0) return 0;
if(str.matches(regex)){
int flag = 1;
if(str.contains(&+&)){
str = str.replace(&+&, &&);
if(str.contains(&-&)){
str = str.replace(&-&, &&);
flag = -1;
char[] charArray = str.toCharArray();
int[] intArray = new int[charArray.length];
for(int i=0;i&charArray.i++){
intArray[charArray.length-1-i] = charArray[i]-'0';
double sum=0;
for(int i =0;i&intArray.i++){
sum = sum+intArray[i]*Math.pow(10, i);
return new Long((long)sum*flag).intValue();
这道题你会答吗?花几分钟告诉大家答案吧!
下面哪个代表以双绞线为传输介质...
扫描二维码,关注牛客网
下载牛客APP,随时随地刷题
京ICP备号-4
扫一扫,把题目装进口袋新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 11, 距离下一级还需 189 积分
论坛徽章:0
我取到一个数,因为中间的操作for file in,变成字符串了
下边再用expr去作数学运算就会出错
请教怎样将字符串转成对应的整数? 比如将&24&转成14,使其能进行加法运算?
小富即安, 积分 2403, 距离下一级还需 2597 积分
论坛徽章:0
应该不需要转换吧!!至少gun的不用
大富大贵, 积分 10824, 距离下一级还需 9176 积分
论坛徽章:0
回复 #1 flyingbox 的帖子
shell中本来就是弱类型的;
[cocobear@cocobear test]$ expr 10 + 10
[cocobear@cocobear test]$ expr &10& + &10&
白手起家, 积分 11, 距离下一级还需 189 积分
论坛徽章:0
原帖由 可可熊 于
16:52 发表
shell中本来就是弱类型的;
[cocobear@cocobear test]$ expr 10 + 10
[cocobear@cocobear test]$ expr &10& + &10&
但我用for file in 这样取出的数,放进expr里边加,会出错......
富足长乐, 积分 6921, 距离下一级还需 1079 积分
论坛徽章:0
walkerxk@www:~$ for i in 1 2 3;do expr $i + 2;done
walkerxk@www:~$
没有问题。
富足长乐, 积分 7078, 距离下一级还需 922 积分
论坛徽章:0
纯数字字符串 既是 字符串,也可是 数
大富大贵, 积分 13284, 距离下一级还需 6716 积分
论坛徽章:11
shell帖出来吧~~~
白手起家, 积分 11, 距离下一级还需 189 积分
论坛徽章:0
原帖由 walkerxk 于
17:01 发表
walkerxk@www:~$ for i in 1 2 3;do expr $i + 2;done
walkerxk@www:~$
没有问题。
恩.我试过了
没有问题.原来的时候是循环中有个其他字串 谢谢!
富足长乐, 积分 6921, 距离下一级还需 1079 积分
论坛徽章:0
你先echo $i看看
你是不是用了for i in &1 2 3&?
北京盛拓优讯信息技术有限公司. 版权所有 京ICP备号 北京市公安局海淀分局网监中心备案编号:22
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处匿名用户不能发表回复!|实现atoi,将字符串转换为整数,注意雷区!!!
//注意各种情况
//1.输入字符
//2.只输入正负号
//5.指针为空
//6.字符串为空
#include&stdio.h&
#include&stdlib.h&
#include&assert.h&
//static int
//int atoi(char *p)
while(*s == ' ')
if (*s == '-'||*s=='+')
if (*s == '-')
while (*s != '\0'&&s!=NULL)//空指针判断
if (*s &= '0'&&*s &= '9')
sum = sum * 10 + flag*(*s - '0');
fg = 0;//判断是否只有正负号
if ((flag==-1&&sum&(unsigned)0x) ||(flag==1&& sum&0x7fffffff))
//int main()
s[30] = & -&;
ret=atoi(s);
if (fg == 1)
printf(&error\n&);
printf(&%d\n&, ret);
system(&pause&);

我要回帖

更多关于 c 整数转换为字符串 的文章

 

随机推荐