项目2 字符串转换成十进制整数 【项目说明】输入一个以#结束的字符串,滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。试编写相应程序。
时间: 2024-02-21 21:00:33 浏览: 164
好的,下面是一个将字符串转换成十进制整数的 C 语言实现,该程序可以处理带符号的十六进制字符串:
```
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
int main() {
char str[100]; // 定义字符串,最大长度为100
int len; // 字符串长度
int is_negative = 0; // 是否为负数标志
int hex_digits[100]; // 保存十六进制数字的数组
int decimal = 0; // 转换后的十进制整数
// 读入字符串
printf("Enter a hex string (ends with #): ");
scanf("%s", str);
// 处理负数标志
if (str[0] == '-') {
is_negative = 1;
memmove(str, str+1, strlen(str)); // 移动字符串,去掉负号
}
// 过滤非十六进制字符,保存十六进制数字
len = strlen(str);
int j = 0; // hex_digits 数组的下标
for (int i = 0; i < len; i++) {
if (str[i] == '#') {
break; // 遇到 # 停止处理
} else if (isxdigit(str[i])) {
hex_digits[j] = isdigit(str[i]) ? str[i] - '0' : toupper(str[i]) - 'A' + 10;
j++;
}
}
// 将十六进制数字转换成十进制整数
for (int k = 0; k < j; k++) {
decimal += hex_digits[k] * pow(16, j-k-1);
}
// 处理负数
if (is_negative) {
decimal = -decimal;
}
// 输出结果
printf("The decimal integer is: %d\n", decimal);
return 0;
}
```
在这个例子中,我们首先读入一个以 # 结束的字符串。然后,我们检查字符串的第一个字符是否为负号,如果是,则将 `is_negative` 标志设置为1,并移动字符串,去掉负号。接着,我们遍历字符串的每一个字符,如果它是十六进制数字,则将其转换成十进制数字并保存到 `hex_digits` 数组中。具体来说,如果当前字符是数字,则将其转换成对应的整数值,如果当前字符是字母,则将其转换成对应的整数值(例如,A 对应 10,B 对应 11,以此类推)。最后,我们使用 `pow` 函数将十六进制数字转换成十进制整数,并根据 `is_negative` 标志处理负数。最后,我们输出转换后的十进制整数。
需要注意的是,这个实现中使用了标准库函数 `isxdigit`、`isdigit` 和 `toupper`,需要包含头文件 `ctype.h`。此外,这个实现中也使用了标准库函数 `strlen`、`memmove` 和 `pow`,需要包含头文件 `string.h` 和 `math.h`。
阅读全文