gpt4 book ai didi

c - 为什么我在 C 中使用 atoi() 会得到这个意想不到的结果?

转载 作者:太空狗 更新时间:2023-10-29 16:45:28 24 4
gpt4 key购买 nike

我不明白以下 C 代码的结果。

main()
{
char s[] = "AAA";
advanceString(s);
}

void advanceString(p[3])
{
int val = atoi(p);
printf("The atoi val is %d\n",val);
}

这里的atoi值显示为0,但我想不出具体原因。根据我的理解,它应该是数组中每个值的小数当量之和?如果我错了,请纠正我。

最佳答案

atoi()将整数的字符串表示形式转换为其值。它不会将任意字符转换成它们的十进制值。例如:

int main(void)
{
const char *string="12345";

printf("The value of %s is %d\n", string, atoi(string));

return 0;
}

标准 C 库中没有任何内容可以将“A”转换为 65 或将“Z”转换为 90,您需要自己编写,特别是对于您期望作为输入的任何字符集。

既然您知道 atoi() 的作用,请不要使用它 来处理您遇到的任何数字输入和。你真的应该处理输入不是你所期望的。 嗯,当我输入 65 而不是 A 时会发生什么?老师喜欢破坏东西。

atoi() 不做任何错误检查,这使得任何依赖它来转换任意输入的东西充其量是脆弱的。相反,使用 strtol() (以 POSIX 为中心的示例):

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main(void)
{
static const char *input ="123abc";
char *garbage = NULL;
long value = 0;

errno = 0;

value = strtol(input, &garbage, 0);

switch (errno) {
case ERANGE:
printf("The data could not be represented.\n");
return 1;
// host-specific (GNU/Linux in my case)
case EINVAL:
printf("Unsupported base / radix.\n");
return 1;
}

printf("The value is %ld, leftover garbage in the string is %s\n",
// Again, host-specific, avoid trying to print NULL.
value, garbage == NULL ? "N/A" : garbage);

return 0;
}

运行时,会给出:

The value is 123, leftover garbage in the string is abc

如果您不关心保存/检查垃圾,您可以将第二个参数设置为NULL。不需要free(garbage)。另请注意,如果您将 0 作为第三个参数传递,则假定输入是十进制、十六进制或八进制表示形式的所需值。如果您需要 10 的基数,请使用 10 - 如果输入不符合您的预期,它将失败。

您还需要检查返回值以了解 long int 可以处理的最大值和最小值。但是,如果返回任何一个以指示错误,则设置 errno。读者的练习是将 *input123abc 更改为 abc123

检查返回很重要,因为您的示例显示了如果不这样做会发生什么。 AbcDeFg 不是整数的字符串表示形式,您需要在函数中对其进行处理。

对于您的实现,我可以给您的最基本建议是一系列开关,例如:

// signed, since a return value of 0 is acceptable (NULL), -1
// means failure
int ascii_to_ascii_val(const char *in)
{
switch(in) {
// 64 other cases before 'A'
case 'A':
return 65;
// keep going from here
default:
return -1; // failure

}

.. 然后循环运行它。

或者,预填充查找函数可以范围(更好)的字典。您不需要散列,只需要一个键 -> 值存储,因为您事先知道它将包含什么,其中标准 ASCII 字符是键,而它们对应的标识符是值。

关于c - 为什么我在 C 中使用 atoi() 会得到这个意想不到的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2729460/

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