以下代码在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指针?
由于
答案 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
头文件。