C语言 strtok 的奇怪指针问题


struct stat buf;
lstat(path, &buf)
char *p;
p = strtok(ctime(&buf.st_mtime)," ");
int i = 0;  
while (p != NULL)
{
printf ("%sn",p);
p = strtok (NULL, " ");
}

上面的代码工作并运行。

但是,我不明白为什么指针p能够只打印,因为它指向strtok()返回的第一个令牌。

当我试图通过将其更改为*p并将其打印出来来尊重它时,它只是返回了分段错误。不知道为什么会这样。

根据C11标准第 7.21.6.1 章,fprintf()函数,用于%s格式说明符,

s

如果不存在l长度修饰符,则参数应是指向字符类型数组的初始元素的指针。(280)数组中的字符是 写入(但不包括)终止空字符。

因此,基本上,%s期望一个指向以 null 结尾的char数组的指针,即字符串

然后,根据strtok()的 [手册页] (http://linux.die.net/man/3/strtok),它返回

指向下一个令牌的指针

因此,在您的代码中

printf ("%sn",p);

打印整个字符串。OTOH,如果你取消引用p,它会给出一个char,这不是%s的有效参数,所以它会产生未定义的行为,产生分割错误。

%s格式的printf需要打印第一个字符的地址。

如果您写printf ("%sn",*p);则将第一个字符作为地址传递给 printf。

例如。str = "1234" --->printf ("%sn",*p);--> 表示 printf 从地址 0x00000031 开始获取字符串。

相关内容

  • 没有找到相关文章

最新更新