【问题标题】:Pointer to a string - C指向字符串的指针 - C
【发布时间】:2011-10-23 22:06:48
【问题描述】:

我正在解析一个文本文件,当我遇到.word 这个词时,我想抓住该行的其余部分。这是我目前所拥有的:

char *word_ptr;

if (strstr(token, ":")){
    // Some code

}

else if ((word_ptr = strstr(token, ".word"))) {
    char *string_wanted = word_ptr + 6;
    printf("Rest: '%s'\n", string_wanted);
}

string_wanted 打印不正确。在else-if 语句中分配它时,我对 word_ptr 的使用是否正确? string_wanted 什么也没有打印出来。当我添加 7 而不是 6 时,它会打印出“ize”。我的文本文件中有字大小,但现在我删除了它,我删除了文件并重新创建它并完成了一个干净的构建,但“ize”这个词仍然出现!它根本不存在于文件中,那么它是从哪里来的?我真的很沮丧文件中不再存在“大小”这个词。

这是文件的样子(当我有“ize”这个词时):

array: .word 0:10
array_size: .word 10

现在我刚刚删除了第二行,所以它是: array: .word 0:10

为什么当我添加 6 时 word_ptr 没有打印出 0:10?我很确定 word_ptr 指向 .word,因为当我打印它时,它会打印 .word。标记线时,array: 正在被标记,所以我知道它正在到达那里。

有什么建议吗?

感谢您的帮助。

【问题讨论】:

  • 你尝试过在 strstr 上测试 NULL 吗?
  • 我为什么要测试它?代码块不是只有在不为空时才执行吗?
  • 是的,这个代码的唯一问题是它永远不会到达 else if(使用您提供的测试用例),当我在我的程序上修复它时,一切都正常工作,请把完整的代码贴上来,你贴的代码没有问题。
  • 一天前有人问了一个非常相似(几乎相同)的问题:Using fgets() in file parsing。另外,如果这是家庭作业,请按此标记。
  • “功课”假设再次指责..

标签: c string parsing


【解决方案1】:

我们在这里有点绕圈子。我想我知道你现在的困惑在哪里,所以我会试着把它摆出来。您的标记器正在获取一个字符串并将其分解为标记。这些标记中的每一个本身都是一个单独的字符串。您没有指定要标记的字符,所以我只假设空格字符。

在这种情况下是字符串:

数组:.word 0:10

变成三个新字符串:

“数组:”

“.word”

“0:10”

如果你在你的令牌上循环(看起来你是),那么第一次循环token将是“array:”,第二次是“.word”,第三次是“0:10”。

本次评价:

word_ptr = strstr(token, ".word")

只会在token 包含“.word”的迭代中找到“.word”。然后,当您将 word_ptr 增加 6 个字符时,您已将 token 的末尾移到未定义的内存中。是的,在您的原始字符串中,“0:10”出现在“.word”之后的两个字符,但我们没有查看您对strstr 的调用中的原始字符串。我们只看到tokentoken 只包含“.word”。

这就是它失败的原因。如何修复它在某种程度上取决于您的实施的其余部分。

【讨论】:

  • 这正是正在发生的事情。我没有意识到标记化实际上会将字符串拆分为单独的字符串。非常感谢。我需要找到一种方法来获取下一个令牌。
【解决方案2】:

当您将*string_wanted 设置为word_ptr + 6 时,您将string_wanted 指向终止字符串的null。因此,当您尝试打印 *string_wanted 时,您会得到一个空字符串。请尝试获取下一个令牌。

【讨论】:

  • 为什么指向nullword_ptr + 6 不将其向右移动六个点,因此指向0:10 字符串的0 吗?
  • 我假设你在空间上进行标记,所以token = ".word"。也许你应该添加你的标记代码。
  • 是的,我也在空间上进行标记。但是增加指针不应该仍然有效吗?
  • 如果您在空间上进行标记,那么token 的全部内容就是“.word”。将 6 添加到 word_ptr 会将令牌末尾的两个字节带入不属于字符串的内存中。
【解决方案3】:

难道你的if (strstr(token, ":")) 不适合你所有的字符串吗?它永远不会到达您所询问的代码块。

【讨论】:

  • 哦,请忽略。它确实到达了我的代码块,我为读者简化了一组许多条件。我只是想表明我在 if-else 语句块中拥有它。
  • 您可能应该将您的问题更新到演示错误所需的最低限度,并自己测试最低限度以验证问题仍然存在,以确保您没有看到我们的代码的副作用不知道。
猜你喜欢
  • 2011-04-12
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 2013-02-16
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多