谁能向我解释一下为什么这个 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
。就是这样。:)
我用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
。就是这样。:)