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 开始获取字符串。