关于运行strtol后剩余的内容

时间:2019-02-08 23:07:03

标签: c strtol

我在理解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,因为我已经检查到末尾了吗?

谢谢您的帮助。

2 个答案:

答案 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)

以下建议的代码:

  1. 干净地编译
  2. 执行所需的功能
  3. 请注意对几条陈述的更正
  4. 注意添加头文件
  5. 请注意功能的附加:main()
  6. 在编程中,细节很重要

现在是建议的代码:

#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字节