我有char数组words
,其中包含一些单词,我必须从中读取所有单词而不使用字符串库(不能使用strtok
)。这就是我所拥有的:
int wordsCount = 0;
for (int i = 0; words[i] != '\0'; i++) {
if (words[i] == ' ')
wordsCount++;
}
wordsCount++;
char word[30];
for (int i = 0; i < wordsCount; i++) {
sscanf(words, "%s", word);
}
该代码只读取第一个单词,我想我必须在sscanf
添加一些内容,但我不知道还有什么方法可以实现我的目标?
答案 0 :(得分:2)
假设您希望继续使用C I / O API,您可以使用std::scanf
的内置空白跳过功能:
int main() {
char const *str = "She sells seashells by the seashore";
char word[30];
unsigned wordLength;
for(; std::sscanf(str, " %29s%n", word, &wordLength) == 1; str += wordLength)
std::printf("Read word: \"%s\"\n", word);
}
输出:
Read word: "She" Read word: "sells" Read word: "seashells" Read word: "by" Read word: "the" Read word: "seashore"
当然,你应该检查错误,而不是我没有;)
答案 1 :(得分:0)
您需要在阅读后增加指针:
char word[30];
int offset = 0;
for (int i = 0; i < wordsCount; i++) {
sscanf(words, "%s", word);
offset += strlen(word) + 1;
}
*如果words
包含连续空格,则上述代码将无法按预期工作。您需要考虑如何修复偏移量。
使用std::string stream
和std::string
的BTW会更容易,更安全。
std::istringstream iss (words);
std::string word;
while(iss >> word) do_something(word);