2

我试图用空格分割一个长字符串,使用sscanf().

例如:我需要拆分这个

We're a happy family

进入

We're
a
happy
family

我尝试了以下方法

char X[10000];
fgets(X, sizeof(X) - 1, stdin); // Reads the long string
if(X[strlen(X) - 1] == '\n') X[strlen(X) - 1] = '\0'; // Remove trailing newline
char token[1000];
while(sscanf(X, "%s", token) != EOF) {
    printf("%s | %s\n", token, X);
}

前面的代码进入一个无限循环输出We're | We're a happy family

我尝试sscanf()用 C++替换istringstream,效果很好。

是什么让 X 保持其价值?它不应该像普通流一样从缓冲区中删除吗?

4

1 回答 1

2

sscanf()确实存储有关它先前读取的缓冲区的信息,并且总是从传递给它的地址(缓冲区)开始。一个可能的解决方案是使用%n格式说明符来记录最后sscanf()停止的位置并X + pos作为第一个参数传递给sscanf(). 例如:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    const char* X = "hello again there";
    char token[1000];
    int current_pos = 0;
    int pos = 0;
    while (1 == sscanf(X + current_pos, "%999s%n", token, &pos))
    {
        current_pos += pos;
        printf("%s | %s\n", token, X + current_pos);
    }
    return 0;
}

请参阅http://ideone.com/XBDTWm上的演示。

或者只是使用istringstreamand std::string

std::istringstream in("hello there again");
std::string token;
while (in >> token) std::cout << token << '\n';
于 2013-01-18T11:56:59.217 回答