数组-08. 字符串转换成十进制整数(15)

本文介绍了一个简单的C程序,用于将包含十六进制字符的字符串转换为十进制数值。程序首先筛选出合法的十六进制字符,并考虑正负号的影响,最终通过数学运算完成转换。


输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果过滤后字符串的首字符为“-”,代表该数是负数。

输入格式:

输入在一行中给出一个以#结束的非空字符串。

输出格式:

在一行中输出转换后的十进制数。题目保证输出在长整型范围内。

输入样例:
+P-xf4+-1!#
输出样例:
-3905

主要有三个工作:

        1.筛选合法字符:十六进制的字符

        2.判断正负号

        3.16->10进制

#include <stdio.h>
#include <math.h>

int main(int argc, const char* argv[])
{
	char ch;
	int number_IN16[10000] = {0};	
	int i;
	
	int cnt = 0, FIRST = 1, sign = 1;
	/* 
		FIRST == 1 表示首次出现的是- 
		sign == 1 表示最后十进制的数的符号 
	*/
	while((ch = getchar()) != '#')
	{
		if( ch>='0' && ch<='9')
		{
			number_IN16[cnt] = ch-'0';
			cnt ++;
			FIRST = 0;
		}
		else if(ch>='a' && ch<='f')
		{
			number_IN16[cnt] = ch-'a' + 10;
			cnt ++;
			FIRST = 0;
		}
		else if(ch>='A' && ch<='F')
		{
			number_IN16[cnt] = ch-'A' + 10;
			cnt ++;
			FIRST = 0;
		}
		if(ch == '-' && FIRST == 1)
			sign = -1;
	}
	
	int sum = 0, q = 0;
	for(i = cnt-1; i >= 0; i--)
	{
		sum += number_IN16[i] * pow(16, q);
		q ++;
	}
	printf("%d", sign * sum);
	
	return 0;
}




<think>我们正在讨论的是如何将字符串转换为十进制数值。根据用户的问题,他可能指的是将表示数字字符串(如十六进制、二进制或普通的十进制字符串)转换为十进制整数值。我们可以参考引用中的一些方法。引用[1]和引用[2]分别提到了十六进制字符串和二进制字符串转换为十进制的方法。引用[3]和引用[4]也涉及了十六进制转换,但用户的需求更偏向于编程实现。根据这些引用,我们可以总结以下转换方法:1.使用内置函数(如Java中的`Integer.parseInt`)可以方便地将字符串转换为十进制整数,支持多种进制。2.手动转换:按位读取字符串中的字符,根据进制规则计算十进制值。下面我们将分别讨论这两种方法,并提供代码示例。注意:用户没有指定编程语言,但引用中提到了Java和C语言,因此我们以这两种语言为例,同时也可以提供Python的示例。问题:如何将字符串转换为十进制数值?步骤:1.确定字符串表示的进制(如二进制、八进制、十进制、十六进制)。2.根据不同的进制选择合适的方法进行转换。方法一:使用内置函数(推荐)-对于Java:-二进制字符串:`Integer.parseInt(binaryString,2)`-八进制字符串:`Integer.parseInt(octalString,8)`-十六进制字符串:`Integer.parseInt(hexString,16)`-十进制字符串:`Integer.parseInt(decimalString)`-对于C语言:-使用`strtol`函数,可以指定进制。-例如:`strtol(hexString,NULL,16)`-对于Python:-使用`int`函数,可以指定进制。-例如:`int("FF",16)`返回255。方法二:手动转换(当没有内置函数或需要理解原理时)原理:按权展开,逐位计算。例如,二进制数"1010"转换为十进制:1*2^3+0*2^2+1*2^1+0*2^0=8+0+2+0=10步骤:1.遍历字符串的每个字符。2.字符转换为对应的数值(如字符'A'在十六进制中为10)。3.用当前数值乘以进制数的幂次(幂次从高位到低位递减,或从低位到高位递增)。4.累加得到结果。下面我们给出具体代码示例。注意:手动转换时,需要处理字符串可能包含的前缀(如"0x")以及大小写问题(十六进制中字母不区分大小写)。我们分别以二进制、十六进制和十进制字符串的转换为例。由于用户特别提到“字符串转换为十进制数值”,我们假设字符串可能代表不同进制的数字。一、使用内置函数的示例:1.Java示例(二进制、十六进制、十进制字符串转换):```javapublicclassStringToDecimal{publicstaticvoidmain(String[]args){StringbinaryStr="1010";StringhexStr="A";StringdecimalStr="10";intdecimalFromBinary=Integer.parseInt(binaryStr,2);intdecimalFromHex=Integer.parseInt(hexStr,16);intdecimalFromDecimal=Integer.parseInt(decimalStr);System.out.println("二进制字符串"+binaryStr+"转十进制:"+decimalFromBinary);System.out.println("十六进制字符串"+hexStr+"转十进制:"+decimalFromHex);System.out.println("十进制字符串"+decimalStr+"转十进制:"+decimalFromDecimal);}}```2.C语言示例(使用`strtol`):```c#include<stdio.h>#include<stdlib.h>intmain(){char*binaryStr="1010";char*hexStr="A";char*decimalStr="10";longdecimalFromBinary=strtol(binaryStr,NULL,2);longdecimalFromHex=strtol(hexStr,NULL,16);longdecimalFromDecimal=strtol(decimalStr,NULL,10);printf("二进制字符串%s转十进制:%ld\n",binaryStr,decimalFromBinary);printf("十六进制字符串%s转十进制:%ld\n",hexStr,decimalFromHex);printf("十进制字符串%s转十进制:%ld\n",decimalStr,decimalFromDecimal);return0;}```3.Python示例:```pythonbinary_str="1010"hex_str="A"decimal_str="10"decimal_from_binary=int(binary_str,2)decimal_from_hex=int(hex_str,16)decimal_from_decimal=int(decimal_str)print(f"二进制字符串{binary_str}转十进制:{decimal_from_binary}")print(f"十六进制字符串{hex_str}转十进制:{decimal_from_hex}")print(f"十进制字符串{decimal_str}转十进制:{decimal_from_decimal}")```二、手动转换的示例(以十六进制字符串为例,其他进制类似):1.Java手动转换十六进制字符串十进制:```javapublicclassHexToDecimalManual{publicstaticvoidmain(String[]args){StringhexStr="1A3";intdecimal=0;intbase=1;//从最低位开始,所以初始基数为1(16^0)//从字符串的末尾(最低位)开始遍历for(inti=hexStr.length()-1;i>=0;i--){charc=hexStr.charAt(i);intdigit;if(c>='0'&&c<='9'){digit=c-'0';}elseif(c>='A'&&c<='F'){digit=10+(c-'A');}elseif(c>='a'&&c<='f'){digit=10+(c-'a');}else{thrownewIllegalArgumentException("Invalidhexcharacter:"+c);}decimal+=digit*base;base*=16;//每前进一位,基数乘以16}System.out.println("十六进制字符串"+hexStr+"转十进制:"+decimal);}}```2.C语言手动转换二进制字符串十进制(参考引用[2]):```c#include<stdio.h>intmain(){charch;longlongdecimal=0;//使用longlong防止大数溢出printf("请输入二进制数:");while((ch=getchar())!='\n'){if(ch=='0'||ch=='1'){decimal=decimal*2+(ch-'0');}else{printf("输入包含非法字符!\n");return1;}}printf("转换后的十进制数:%lld\n",decimal);return0;}```注意事项:-手动转换时,需要处理非法字符-注意数值范围,避免溢出(例如使用long或BigInteger)。-对于带符号的数,需要额外处理符号位。总结:推荐使用内置函数,因为它们已经经过充分测试,且支持大数、负数等。但在某些不支持内置函数的环境下,或者为了学习目的,手动转换也是必要的。根据用户之前的问题(字符串字符数组),这里我们也可以将字符串转换成字符数组,然后对每个字符进行处理。例如,在手动转换中,我们可以先将字符串转为字符数组,然后遍历数组。例如,在Java中:```javaStringhexStr="1A3";char[]chars=hexStr.toCharArray();intdecimal=0;intbase=1;for(inti=chars.length-1;i>=0;i--){//对chars[i]进行处理...}```最后,如果用户的需求是将任意进制的字符串转换为十进制,那么需要指定进制参数。在手动转换中,我们可以将基数作为变量。例如,一个通用的手动转换方法(Java):```javapublicstaticintstringToDecimal(StringnumberStr,intbase){char[]chars=numberStr.toCharArray();intdecimal=0;intpower=1;//从最低位开始,初始为base^0=1for(inti=chars.length-1;i>=0;i--){charc=chars[i];intdigit=Character.digit(c,base);//这里使用Character.digit方法将字符转换为对应进制的数值if(digit<0){thrownewIllegalArgumentException("Invalidcharacterforbase"+base);}decimal+=digit*power;power*=base;}returndecimal;}```注意:上述通用方法中,我们使用了`Character.digit`来转换字符,这样就不需要针对不同进制写不同的转换逻辑了。希望这些方法能够满足用户的需求。相关问题:1.如何将十进制数值转换为其他进制的字符串?2.如何处理转换过程中的溢出问题?3.如何转换浮点数字符串为十进制浮点数?4.在转换带有千位分隔符的字符串(如"1,000")时需要注意什么?5.不同编程语言中字符串转数值的性能差异如何?</think>### 字符串十进制数值的编程实现 在编程中将字符串转换为十进制数值的核心方法是 **解析数字字符串并计算其数值表示**。以下是不同语言和场景下的实现方法: #### 一、基础转换方法(推荐) ##### 1. 使用内置函数(最高效) ```java // Java 示例 String numStr = "12345"; int decimal = Integer.parseInt(numStr); // 字符串int long bigDecimal = Long.parseLong(numStr); // 大数转long double floatDecimal = Double.parseDouble("3.14"); // 浮点数 System.out.println(decimal); // 输出: 12345 ``` ```python # Python 示例 num_str = "FF" decimal = int(num_str, 16) # 十六进制转十进制 print(decimal) # 输出: 255 float_str = "3.1415" float_decimal = float(float_str) ``` ##### 2. C语言实现 ```c #include <stdio.h> #include <stdlib.h> int main() { char str[] = "A1F"; // 十六进制字符串 char *endptr; // 十六进制转十进制 long decimal = strtol(str, &endptr, 16); printf("%ld\n", decimal); // 输出: 2591 // 二进制转十进制(参考引用[2]) char bin[] = "1101"; long binDecimal = strtol(bin, NULL, 2); printf("%ld\n", binDecimal); // 输出: 13 } ``` #### 二、手动转换算法(理解原理) ##### 1. 整数转换原理 对于数字字符串 `s`,转换公式为: $$ \text{decimal} = \sum_{i=0}^{n-1} (s[i] - '0') \times 10^{(n-1-i)} $$ ```java // 手动实现字符串整数 public static int stringToInt(String s) { int result = 0; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c < '0' || c > '9') throw new NumberFormatException("非法字符: " + c); result = result * 10 + (c - '0'); // 核心计算 } return result; } ``` ##### 2. 十六进制转十进制(参考引用[1][4]) ```c #include <ctype.h> int hexToDecimal(char hex[]) { int decimal = 0; int base = 1; // 16^0 for (int i = strlen(hex)-1; i >= 0; i--) { char c = toupper(hex[i]); int digit; if (c >= '0' && c <= '9') digit = c - '0'; else if (c >= 'A' && c <= 'F') digit = 10 + (c - 'A'); else return -1; // 非法字符 decimal += digit * base; base *= 16; // 权重增加 } return decimal; } ``` #### 三、特殊场景处理 ##### 1. 带符号的数字 ```java // 处理正负号 public static int parseSigned(String s) { if (s.startsWith("-")) return -stringToInt(s.substring(1)); else if (s.startsWith("+")) return stringToInt(s.substring(1)); else return stringToInt(s); } ``` ##### 2. 浮点数转换 ```java // 字符串转浮点数 public static double stringToDouble(String s) { String[] parts = s.split("\\."); int integerPart = Integer.parseInt(parts[0]); if (parts.length > 1) { double fractional = Integer.parseInt(parts[1]); fractional /= Math.pow(10, parts[1].length()); return integerPart + fractional; } return integerPart; } ``` #### 四、错误处理与验证 1. **空字符串检查**:`if (s == null || s.isEmpty())` 2. **非法字符检测**:使用正则表达式验证 ```java // 验证整数格式 boolean isValid = s.matches("-?\\d+"); ``` 3. **溢出处理**(Java): ```java try { long value = Long.parseLong(bigStr); } catch (NumberFormatException e) { // 处理溢出或格式错误 } ``` #### 五、性能对比 | 方法 | 时间复杂度 | 适用场景 | |------|-----------|----------| | 内置函数 | $O(n)$ | 所有标准数字 | | 手动转换 | $O(n)$ | 自定义格式/教学 | | 正则验证 | $O(n)$ | 输入预处理 | > **最佳实践**:优先使用语言内置的解析函数(如`Integer.parseInt()`),仅在需要特殊处理时使用手动实现[^1][^4]。 ### 应用场景 1. 用户输入处理(表单数据转换) 2. 文件解析(CSV/JSON中的数字字段) 3. 网络协议数据解析 4. 加密算法中的数值转换 ```mermaid graph LR A[输入字符串] --> B{验证合法性} B -->|合法| C[调用解析函数] B -->|非法| D[返回错误] C --> E[获得十进制数值] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值