【问题标题】:Weird pointer issue with strtokstrtok 的奇怪指针问题
【发布时间】:2015-07-17 16:40:44
【问题描述】:
struct stat buf;
lstat(path, &buf)

char *p;
p = strtok(ctime(&buf.st_mtime)," ");
int i = 0;  

while (p != NULL)
{
    printf ("%s\n",p);
    p = strtok (NULL, " ");
}

上面的代码可以运行。

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

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

【问题讨论】:

  • 因为%s 需要char*,而不是char*pchar。使用%c 格式说明符打印此字符。
  • 你到底想在p = strtok (NULL, " ");行中做什么?
  • @Dariusz strtok(NULL, " "); 继续标记" " 上的字符串(这不应该是' ' 吗?)
  • @Baldrickk 是的,你是对的,strtok 存储了一个内部指针。没想到不安全。不过,第二个参数没问题。它用作字符列表。
  • 在我看来,在 ctime() 拥有的缓冲区上调用 strtok() 的形式非常糟糕。

标签: c pointers segmentation-fault printf strtok


【解决方案1】:

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

如果你写printf ("%s\n",*p);,你将把第一个字符作为地址传递给 printf。

例如。 Str = "1234" ---> printf ("%s\n",*p); --> 表示 printf 取从地址 0x00000031 开始的字符串。

【讨论】:

    【解决方案2】:

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

    s

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

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

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

    指向下一个标记的指针

    因此,在您的代码中

     printf ("%s\n",p);
    

    打印整个字符串.OTOH,如果您取消引用p,它会给出char,这不是%s 的有效参数,因此它会产生undefined behaviour ,造成分段错误。

    【讨论】:

      猜你喜欢
      • 2011-03-09
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 2013-02-04
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      • 2023-04-10
      相关资源
      最近更新 更多