逐字读取字符数组,不带字符串函数

时间:2017-05-18 09:24:27

标签: c++ arrays char

我有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添加一些内容,但我不知道还有什么方法可以实现我的目标?

2 个答案:

答案 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"

当然,你应该检查错误,而不是我没有;)

Live demo

答案 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 streamstd::string的BTW会更容易,更安全。

std::istringstream iss (words);
std::string word;
while(iss >> word) do_something(word);