指向字符串的指针 - C.

时间:2011-10-23 22:06:49

标签: c string parsing

我正在解析一个文本文件,当我遇到单词.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”这个词仍然显示出来!它根本不存在于文件中,所以它来自哪里?我真的很沮丧,文件中不再存在'size'这个词。

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

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

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

为什么word_ptr在我添加6时不打印0:10?我很确定word_ptr指向.word,因为当我打印它时,它会打印.word。在对行进行标记时,array:正在被标记化,因此我知道它已到达那里。

有什么建议吗?

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

我们在这里乱跑了几圈。我想我现在看到你的困惑在哪里,所以我会试着把它说出来。你的标记器正在取一个字符串并将其分解为标记。这些令牌中的每一个本身都是一个单独的字符串。您没有指定要标记的字符,因此我将假设空格字符。

在这种情况下,字符串:

  

数组:.word 0:10

成为三个新字符串:

  

“数组:”

     

“词”

     

“0:10”

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

此评估:

word_ptr = strstr(token, ".word")

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

这就是它失败的原因。如何解决它取决于你的其余实现。

答案 2 :(得分:0)

你的if (strstr(token, ":"))不会对你的所有字符串都是真的吗?它永远不会到达你所询问的代码块。