在64位机器上strtok

时间:2012-02-21 00:45:56

标签: c 32bit-64bit strtok

以下代码在64位和32位上的工作方式不同,这导致我无法移植代码。

char * tmp = "How are you?";
printf("size of char * = %ld and size of strtok return val = %ld \n",sizeof(char *),sizeof(strtok(tmp," ")));

以下是输出:

32 bit: 
size of char * = 4 and size of strtok return val = 4 

64 bit:

size of char * = 8 and size of strtok return val = 4

strtok的手册页说:

   #include <string.h>

   char *strtok(char *str, const char *delim);

RETURN VALUE
       The strtok() and strtok_r() functions return a pointer to the next token, or NULL if there are no more tokens.

64位机器上的char *应该是打印的8个字节。那么为什么strtok在64位机器上返回一个4字节的char指针?

由于

2 个答案:

答案 0 :(得分:9)

你忘了#include <string.h>

这导致编译器推断出int的默认返回类型。通过#include正确的头文件,将正确的原型拉入范围。

这解决了我在gcc上遇到的问题。如果它不适合您,您使用的编译器是什么?

答案 1 :(得分:3)

调用strtok(tmp, " ")会导致未定义的行为,因为它会尝试修改tmp指向的字符串文字 - 但由于sizeof的操作数未被评估(有一个例外)这里不适用),这不是问题。

真正的问题是,您尝试使用size_t格式打印"%ld"值,这需要unsigned long参数。

如果您的实现支持它,size_t参数的正确格式为"%zu"(在C99中添加):

printf("size of char * = %zu and size of strtok return val = %zu\n",
       sizeof(char *), sizeof(strtok(tmp," ")));

否则,将参数显式转换为适当的大小。我使用"%lu",因为size_t是无符号类型。

printf("size of char * = %lu and size of strtok return val = %lu\n",
       (unsigned long)sizeof(char *), (unsigned long)sizeof(strtok(tmp," ")));

这是一个完整的自包含程序,可以在任何C89或更高版本的实现中产生预期的结果:

#include <stdio.h>
#include <string.h>
int main(void) {
    char * tmp = "How are you?";
    printf("size of char * = %lu and size of strtok return val = %lu\n",
           (unsigned long)sizeof(char *),
           (unsigned long)sizeof(strtok(tmp," ")));
    return 0;
}

编辑: OP对另一个答案的评论表明string.h标题是问题;显然他已经

#include "string.h"

而不是

#include <string.h>

我将在这里留下这个答案,因为它描述了需要在OP代码中修复的另一个问题,尽管不是引起观察到的症状的问题。 并且编译器选择了错误的string.h头文件。