谁能向我解释一下为什么这个 atoi 命令起作用以及如何起作用

who can please explain to me why this atoi command works and how

我用atoi命令写了一个非常基础的c代码,然后执行它。

void
main
(void)
{
    int length;

    length = atoi("Content: 111");
    printf("atoi(\"Content: 111\") =  %d\n",length);

    length = atoi("Content:    111" + 10);
    printf("atoi(\"Content:    111\" + 10) = %d\n",length);

    length = atoi("Content: 1" + 6);
    printf("atoi(\"Content: 1\" + 6) = %d\n",length);

    length = atoi("Content: 111" + 12);
    printf("atoi(\"Content: 111\" + 12) = %d\n",length);

    length = atoi("Content-aaaaaa:            111" + 20);
    printf("atoi(\"Content-aaaaaa:            111\" + 20) = %d\n",length);

    printf("\"aaa\"+7 = %s","aaa"+7);
}

输出结果如下:

atoi("Content: 111") =  0
atoi("Content:    111" + 10) = 111
atoi("Content: 1" + 6) = 0
atoi("Content: 111" + 12) = 0
atoi("Content-aaaaaa:            111" + 20) = 111
"aaa"+7 = ;

这怎么可能?为什么 atoi 跳过我用 + int 写的字符数? 我应该是错误的,不是吗? 为什么最后一个 printf 也有效?

我阅读了文档,没有关于此行为的内容:

int atoi (const char * str); 将字符串转换为整数 解析 C 字符串 str,将其内容解释为一个整数,该整数作为 int 类型的值返回。

该函数首先根据需要丢弃尽可能多的空白字符(如在 isspace 中),直到找到第一个非空白字符。然后,从这个字符开始,取一个可选的初始加号或减号,后跟尽可能多的以 10 为底的数字,并将它们解释为数值。

字符串可以在构成整数的字符之后包含其他字符,这些字符将被忽略并且不会影响此函数的行为。

如果 str 中的第一个非空白字符序列不是有效整数,或者由于 str 为空或仅包含空白字符而不存在这样的序列,则不执行任何转换并返回零。

atoi 解析整数,但也接受前导 space 个字符。

剩下的就是简单的指针运算。

  • 当您执行 "Content: 111" + 10 时,您将 " 111" 传递给 atoi 并且它有效。
  • 当您执行 "Content: 1" + 6 时,您将 "t: 1 传递给 atoi 并且它 returns 0.
  • "aaa"+7:不要那样做:未定义的行为。

考虑示例语句

length = atoi("Content:    111" + 10);

这个表达式

"Content:    111" + 10

在函数调用中用作参数包含所谓的指针运算。

具有类型 char[16] 的字符串文字 "Content: 111" 被隐式转换为指向其第一个字符的指针,即它获得类型 char *。然后将整数值 10 添加到指针,该指针产生距字符串文字开头的偏移量。

因此表达式

"Content:    111" + 10
           ^

指向字符串文字中标记的位置。

您可以通过以下方式对函数调用进行成像

char *tmp = "Content:    111";
tmp = tmp + 10;
puts( tmp ); // just for testing
length = atoi( tmp );

该函数跳过前导白色 space 字符,直到遇到数字或符号并提取数字 111。就是这样。:)