我正在解析一个文本文件,当我遇到单词.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:
正在被标记化,因此我知道它已到达那里。
有什么建议吗?
感谢您的帮助。
答案 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
的调用中查看原始字符串。我们只看token
而token
只包含“.word”。
这就是它失败的原因。如何解决它取决于你的其余实现。
答案 2 :(得分:0)
你的if (strstr(token, ":"))
不会对你的所有字符串都是真的吗?它永远不会到达你所询问的代码块。