c - C - htoi 函数
问题描述
我正在尝试编写一个htoi
函数来C
读取十六进制数字流,包括前导0x
or 0X
,并返回相应的数值。
有人可以帮我找出我的htoi
功能有什么问题吗?它似乎只适用于十六进制的整数(0-9),而不适用于'A'/'a' - 'F'/'f'。我只是好奇我的代码有什么问题。
例如,在我输入“Ox777”时,我得到了数字 1911,这是正确的,但是,如果我输入“Ox7DF”,我得到了错误的数字值:它不处理字母,只处理数字字符。
#include<stdio.h>
#include<string.h>
#define YES 1
#define No 1
int htoi(char s[])
{
int i = 0;
if (s[i] == '0')
{
++i;
}
if (s[i] == 'x' || s[i] == 'X')
{
++i;
}
int n = 0;
int hexdigit;
for(; i < strlen(s); ++i )
if (s[i] >= '0' && s[i] <= '9'){
hexdigit = s[i] - '0';
n = 16 * n + hexdigit;
}
if (s[i] >= 'A' && s[i] <= 'F'){
hexdigit = s[i] - 'A' + 10;
n = 16 * n + hexdigit;
}
if (s[i] >= 'a' && s[i] <= 'f'){
hexdigit = s[i] - 'a' + 10;
n = 16 * n + hexdigit;
}
printf("%d", n);
return n;
}
int main()
{
char a[] = "0x71927";
htoi(a);
return 0;
}
解决方案
for
您的语句后缺少一组花括号!就目前而言,循环的主体只是以下代码:
if (s[i] >= '0' && s[i] <= '9') {
hexdigit = s[i] - '0';
n = 16 * n + hexdigit;
}
这是因为,如果没有紧跟在语句后面的{
...}
分隔块,那么只有一个语句用于循环(并且这个“单个语句”是整个第一个块)。在第三个块之后添加相关的行(或在它之后的行,如果您愿意)和相应的修复代码:for
if
{
for
}
if
for (; i < strlen(s); ++i) { // Note the added "{" - which 'starts' the loop's block!
if (s[i] >= '0' && s[i] <= '9') {
hexdigit = s[i] - '0';
n = 16 * n + hexdigit;
}
if (s[i] >= 'A' && s[i] <= 'F') {
hexdigit = s[i] - 'A' + 10;
n = 16 * n + hexdigit;
}
if (s[i] >= 'a' && s[i] <= 'f') {
hexdigit = s[i] - 'a' + 10;
n = 16 * n + hexdigit;
}
} // And this "}" closes the loop!
在您的代码中,没有对循环内的“A..F”和“a..f”字符进行测试,因此十六进制数中的任何此类字符都将被忽略(视为零)。当后续的两个if
测试都执行时,s[i]
将指向nul
字符串的终止符。
推荐阅读
- video - ffmpeg - 使用 -debug mb_type 命令检索视频宏块信息
- python - 终端无法将 pip 识别为 macOS 上的目录
- c# - 使用响应式扩展批量轮询数据库表
- cucumber - Cucumber 测试用例一起运行时失败,但单独运行时通过
- intellij-idea - 使用 Search Everywhere 从特定文件夹中按名称搜索文件:IntelliJ IDEA
- html - s 在桌面上进入全屏宽度,但在移动设备上没有,为什么?
- db2 - DB2 添加列、插入数据和新 id
- c# - 是否有内置的 IEqualityComparer
对于 System.Int32? - r - ggplot2根据时间序列R中的因子放置矩形或平铺
- javascript - 通过路由发送参数