gpt4 book ai didi

c++ - 使用 sscanf() 拆分空白字符串

转载 作者:行者123 更新时间:2023-11-30 04:21:37 30 4
gpt4 key购买 nike

我正在尝试使用 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 |我们是一个幸福的家庭

我尝试用 C++ istringstream 替换 sscanf(),它工作正常。

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

最佳答案

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 的演示.

或者只使用 istringstreamstd::string:

std::istringstream in("hello there again");
std::string token;
while (in >> token) std::cout << token << '\n';

关于c++ - 使用 sscanf() 拆分空白字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14398397/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com