gpt4 book ai didi

c - 关于 Kernighan 和 Ritchie 练习 2-3 的问题

转载 作者:太空宇宙 更新时间:2023-11-04 06:37:29 25 4
gpt4 key购买 nike

我正在尝试用 C 语言编写一个程序,将十六进制数转换为整数。我成功地编写了一个将八进制转换为整数的程序。但是,一旦我开始使用字母 (a-f),问题就开始了。我对该计划的想法是广告如下:

  1. 参数必须是以0x或0X开头的字符串。

  2. 参数十六进制数存储在一个字符串s[]中。

  3. 整数n初始化为0,然后按规则转换。

我的代码如下(我只读了 K & R 的 p37,所以对指针了解不多):

/*Write a function htoi(s), which converts a string of hexadecimal digits (including an optional 0x or 0X) into its equivalent integer value. The allowable digits are 0 through 9, a through f, and A through F.*/

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

int htoi(const char s[]) { //why do I need this to be constant??
int i;
int n = 0;
int l = strlen(s);
while (s[i] != '\0') {
if ((s[0] == '0' && s[1] == 'X') || (s[0] == '0' && s[1] == 'x')) {
for (i = 2; i < (l - 1); ++i) {
if (isdigit(s[i])) {
n += (s[i] - '0') * pow(16, l - i - 1);
} else if ((s[i] == 'a') || (s[i] == 'A')) {
n += 10 * pow(16, l - i - 1);
} else if ((s[i] == 'b') || (s[i] == 'B')) {
n += 11 * pow(16, l - i - 1);
} else if ((s[i] == 'c') || (s[i] == 'C')) {
n += 12 * pow(16, l - i - 1);
} else if ((s[i] == 'd') || (s[i] == 'D')) {
n += 13 * pow(16, l - i - 1);
} else if ((s[i] == 'e') || (s[i] == 'E')) {
n += 14 * pow(16, l - i - 1);
} else if ((s[i] == 'f') || (s[i] == 'F')) {
n += 15 * pow(16, l - i - 1);
} else {
;
}
}
}
}
return n;
}


int main(void) {
int a = htoi("0x66");
printf("%d\n", a);
int b = htoi("0x5A55");
printf("%d\n", b);
int c = htoi("0x1CA");
printf("%d\n", c);
int d = htoi("0x1ca");
printf("%d\n", d);
}

我的问题是:

<强>1。如果我不在 htoi(s) 的参数中使用 const,我会从 g++ 编译器收到以下警告:

2-3.c: In function ‘int main()’: 2-3.c:93:20: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] 2-3.c:97:22: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] 2-3.c:101:21: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] 2-3.c:105:21: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]

这是为什么?

2.为什么我的程序运行要花这么多时间?我还没有看到结果。

3.为什么当我在终端输入cc 2-3.c 而不是g++ 2-3.c 时,出现以下错误信息:

"undefined reference to `pow'"

在我使用幂函数的每一行上?

<强>4。请务必指出我的程序中的其他错误/潜在改进。

最佳答案

If I don't use const in the argument for htoi(s), i get the following warnings from the g++ compiler

const 参数应该在那里,因为从不从指针类型转换 const 被认为是好的和适当的编程。字符串文字“...”应被视为常量,因此如果您没有将 const 作为参数,编译器会认为您正在放弃 const 限定符。

此外,您应该将您不打算修改其内容的所有指针参数声明为常量,谷歌术语常量正确性

Why is my program taking so much time to run? I haven't seen the results yet.

我认为主要是因为您搞错了初始化。 int i; i 包含垃圾。然后 while (s[rubbish_value] != '\0')。这个函数也可以写得更好。首先检查字符串开头的 0x,如果不存在,则发出错误信号(返回 NULL?),否则丢弃它们。然后开始一个单循环,不需要2个循环。

请注意,pow() 函数处理 float ,这会使您的程序稍微慢一些。您可以考虑使用仅整数版本。不幸的是,标准 C 中没有这样的函数,因此您必须在别处找到一个。

还要考虑函数 isxdigit(),这是 ctype.h 中的一个标准函数,它检查数字 0-9 以及十六进制字母 A-F 或 a-f。但是,这可能对性能没有帮助,因为您需要对数字和字母执行不同的计算。

对于它的值(value),这里有一个片段显示了如何将单个 char 转换为十六进制 int。它可能不是最优化的版本,但它利用可用的标准函数来提高可读性和可移植性:

#include <ctype.h>

uint8_t hexchar_to_int (char ch)
{
uint8_t result;

if(isdigit(ch))
{
result = ch - '0';
}
else if (isxdigit(ch))
{
result = toupper(ch) - 'A' + 0xA;
}
else
{
// error
}

return result;
}

关于c - 关于 Kernighan 和 Ritchie 练习 2-3 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13007476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com