我在理解C中strtol()
的行为时遇到了麻烦。例如,当我测试字符串" 4396"
时,如果有:
char *test = " 4396";
char *ptr;
int result = strtol(test, &ptr, 10);
printf("%d\n", result);
printf("%d\n", strlen(ptr));
输出:
4396
//not 0
我只是想知道为什么长度不是0
,因为我已经检查到末尾了吗?
谢谢您的帮助。
答案 0 :(得分:1)
strtol()
存储指向" 4396"
中最后一位数字之后的字符的指针,因此存储指向此字符串常量的空终止符的指针。
ptr
指向的C字符串的长度是0
返回的strlen()
,类型为size_t
。
令人惊讶的是,语句printf("%d\n", strlen(ptr));
没有输出。这里有一些提示:
一个可能的解释是strlen()
返回一个size_t
,您将其作为%d
的参数传递,该参数期望一个int
。传递不兼容的类型(例如,size_t
,其大小可以不同)具有未定义的行为。您应该使用C99转换规范printf("%zu\n", strlen(ptr));
或将长度转换为unsigned long
以便移植到旧版C库:printf("%lu\n", (unsigned long)strlen(ptr));
另一个可能的解释是您没有包含<string.h>
,并且推断strlen()
返回类型int
,这与返回的实际类型不同...未定义的行为为好吧。
您没有发布完整的程序,所以问题可能出在其他地方,即您未发布的代码中。
最后但并非最不重要的一点:您已更正了初始帖子中的代码,并使问题无关紧要。 ptr
是未初始化的指针,传递给strlen()
具有未定义的行为,可能导致程序停止,这将解释您为什么未获得任何输出的原因。
答案 1 :(得分:1)
以下建议的代码:
main()
现在是建议的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main( void )
{
char* test = " 4396";
char *ptr;
long result = strtol(test,&ptr,10); // note the change from `int` to `long`
printf("%ld\n",result); // note the change from'%d' to '%ld'
printf("%zu\n",strlen(ptr)); // note the change from '%d' to '%zu'
}
建议代码的输出为:
4396
0
请注意第二个输出为0,因为strlen()
不计算末尾的NUL字节,并且ptr
指向NUL字节