字符串转int类型

本文介绍了一个简单的Java方法,用于将字符串转换为整型。该方法首先检查字符串是否以负号开头,并相应地调整转换过程。通过遍历字符并利用ASCII码特性完成转换。

import org.junit.Test;

public class solution {
    @Test
    public void testFunc(){
//    String string = "-10";
    String string = "10";
    int res = parseInt(string);
    System.out.println("res: "+res);
    
    }
    
//    字符串转int类型
    
    public int parseInt(String str){
        char ele = str.charAt(0);
        boolean fuShu = false;
        if (ele=='-') {
            str = str.substring(1);
            fuShu=true;
        }
        char[] charArray = str.toCharArray();
        int res=0;
        for(int i=0;i<charArray.length;i++){
            res=res*10+(charArray[i]-'0');
        }
        if (fuShu) {
            res = 0-res;
        }
        
        return res;
    }
    
}
<think> 我们正在讨论C语言中字符串int类型的方法。根据引用[2]和引用[3],有两种主要方法:一种是利用字符与数字ASCII码的差值(如'0'的ASCII为48,所以用字符减去'0'得到对应数字),另一种是处理带符号(正负号)的字符串。 方法一(引用[2]): 遍历字符串的每个字符(注意字符串末尾有'\0',所以长度要减1),将每个字符减去'0'得到对应的数字,然后通过乘以10和累加的方式构建整数。 方法二(引用[3]): 考虑符号处理(第一个字符可能是'+'或'-'),用标志位记录正负,然后同样将后续字符换为数字并构建整数,最后根据符号标志调整正负。 下面我将总结这两种方法,并给出示例代码。 ### C语言字符串int的两种方法 #### 方法1:不考虑符号(仅处理数字字符串) 此方法适用于无符号数字字符串(如"12345")。步骤如下: 1. 遍历字符串的每个字符(不包括结尾的`'\0'`)。 2. 将每个字符减去字符`'0'`(ASCII值48)得到对应的整数值(0~9)。 3. 将之前的结果乘以10,再加上当前数字,实现按位组合。 示例代码(基于引用[2]): ```c #include <stdio.h> int string2int(char b[], int len) { int i; int c = 0; // 结果变量 for(i = 0; i < len - 1; i++) { // len-1是因为字符串末尾有'\0' int c1 = b[i] - '0'; // 字符数字 c = c * 10 + c1; // 组合数字 } return c; } int main() { char b[] = "12345"; int len = sizeof(b) / sizeof(char); // 计算字符串长度(包括'\0',所以len=6) printf("%d\n", string2int(b, len)); // 输出:12345 return 0; } ``` #### 方法2:考虑符号(可处理带正负号的字符串) 此方法可处理带正负号(如"-123"或"+456")的字符串。步骤如下: 1. 检查第一个字符是否为符号(`+`或`-`),并设置符号标志(`flag=1`表示正,`flag=-1`表示负)。 2. 如果第一个字符是符号,则从下一个字符开始换;否则从第一个字符开始。 3. 同样使用字符减`'0'`得到数字,并组合成整数。 4. 最后将结果乘以符号标志。 示例代码(基于引用[3]): ```c #include <stdio.h> int string2int_with_sign(char str[]) { int i = 0; int sign = 1; // 默认正号 int num = 0; // 处理符号 if (str[i] == '-') { sign = -1; i++; } else if (str[i] == '+') { i++; // 正号可以忽略,因为sign已经是1 } // 遍历剩余字符 while (str[i] != '\0') { if (str[i] >= '0' && str[i] <= '9') { num = num * 10 + (str[i] - '0'); i++; } else { break; // 遇到非数字字符则停止 } } return sign * num; } int main() { char str1[] = "-1234"; char str2[] = "+5678"; char str3[] = "9876"; printf("%d\n", string2int_with_sign(str1)); // -1234 printf("%d\n", string2int_with_sign(str2)); // 5678 printf("%d\n", string2int_with_sign(str3)); // 9876 return 0; } ``` #### 注意事项 1. **边界情况**:空字符串、单个符号字符(如"-")、非数字字符等。上述示例未完全处理这些情况,实际应用中应增加错误检查。 2. **溢出问题**:如果字符串表示的整数超出`int`范围(如超过`INT_MAX`或小于`INT_MIN`),则结果未定义。需要额外处理溢出(可参考标准库函数`strtol`的实现)。 3. **效率**:直接换,时间复杂度为$O(n)$,$n$为字符串长度。 #### 标准库替代方案 C标准库提供了更健壮的字符串整数函数: - `int atoi(const char *str);` (不检查错误) - `long int strtol(const char *str, char **endptr, int base);` (可检查错误,支持多种进制) 推荐使用`strtol`,因为它能检测溢出并设置`errno`。 ### 总结 字符串整型的关键是字符与数字的换(`字符 - '0'`)和按位组合。实际开发中,建议优先使用标准库函数(如`strtol`)以确保健壮性。若需自定义换,务必处理符号和溢出问题[^2][^3]。 §§相关问题§§ 1. 如何用`strtol`函数安全地字符串为整数? 2. 如何处理字符串整数过程中的溢出问题? 3. 字符串浮点数(如`float`或`double`)有哪些方法? 4. 如何实现自定义进制(如二进制、十六进制)的字符串整数? </think>### C语言字符串int类型方法总结 在C语言中,将字符串换为int类型有**三种主要方法**,根据实际需求选择合适方案: #### 1. 使用标准库函数 `atoi()`(最简单) ```c #include <stdlib.h> #include <stdio.h> int main() { char str[] = "-12345"; int num = atoi(str); // 直接换 printf("%d\n", num); // 输出: -12345 return 0; } ``` - **优点**:一行代码完成换 - **缺点**: - 无法检测换错误(如非数字字符) - 溢出时行为未定义 - **适用场景**:已知安全的数字字符串[^1] #### 2. 手动换(核心算法) 基于ASCII码差值的通用方法(参考引用[2][3]): ```c #include <stdio.h> #include <ctype.h> // 用于isdigit() int string_to_int(const char *str) { int sign = 1, result = 0; // 处理符号 if (*str == '-') { sign = -1; str++; } else if (*str == '+') { str++; } // 遍历每个字符 while (*str != '\0') { if (!isdigit(*str)) break; // 遇到非数字停止 result = result * 10 + (*str - '0'); // 核心换逻辑 str++; } return sign * result; } int main() { printf("%d\n", string_to_int("123")); // 123 printf("%d\n", string_to_int("-456")); // -456 printf("%d\n", string_to_int("7a89")); // 7 (遇到a停止) return 0; } ``` - **核心原理**: `字符 - '0' = 数字值`(ASCII码特性,`'0'=48`, `'1'=49`等) - **关键步骤**: 1. 处理正负号 2. 遍历字符串,跳过非数字字符 3. `result = result*10 + (当前字符 - '0')` - **优点**:可自定义错误处理逻辑 - **缺点**:需手动处理边界情况[^2][^3] #### 3. 安全换 `strtol()`(推荐) ```c #include <stdlib.h> #include <stdio.h> #include <errno.h> int main() { char *endptr; char str[] = "123abc"; long num = strtol(str, &endptr, 10); // 10表示十进制 if (str == endptr) { printf("无有效数字\n"); // 如"abc" } else if (errno == ERANGE) { printf("数值溢出\n"); // 超过long范围 } else { printf("换结果: %ld\n", num); // 123 printf("剩余字符串: %s\n", endptr); // "abc" } return 0; } ``` - **参数说明**: `strtol(字符串, 结束指针, 进制)` - **安全特性**: - 检测无效输入(通过`endptr`) - 检测数值溢出(设置`errno=ERANGE`) - 支持2-36进制(如二进制`strtol("1010", NULL, 2)`) - **最佳实践**:生产环境首选此方法[^1] --- ### 关键知识点总结 1. **ASCII换原理** `'0'→48`, `'1'→49`... 故 `'7'-'0' = 55-48=7`[^3] 2. **错误处理要点** | 问题类型 | 检测方法 | |----------------|--------------------------| | 空字符串 | `str == endptr` | | 非数字字符 | 检查`endptr`位置 | | 数值溢出 | `errno == ERANGE` | | 无效符号 | 检查首字符是否`+/-/数字` | 3. **性能对比** | 方法 | 安全性 | 灵活性 | 执行速度 | |-------------|--------|--------|----------| | `atoi()` | 低 | 低 | 最快 | | 手动换 | 中 | 高 | 中等 | | `strtol()` | 高 | 高 | 较慢 | > 💡 实际开发建议: > - 快速原型开发 → 用`atoi()` > - 需要错误处理 → 用`strtol()` > - 特殊格式解析 → 手动实现换逻辑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值