在C ++中,如何从字符串(或char数组)中提取子字符串并将其写入字符串,而不会收到警告?

时间:2016-02-23 17:42:43

标签: c++ string scanf

在C ++中,我正在读取一个文件,其中的行类似于

     65-82 0.015 0.655

其中第一个是字符串(由短划线或逗号分隔的数字,然后被处理)和两个浮点数。我正在使用以下代码阅读它们,[line]是一个字符数组:

std::string temp_string;
double temp_kb, temp_kt;
int res = sscanf(line, "%s %lf %lf",temp_string,&temp_kb,&temp_kt);

这会产生警告:

~/TEPInteraction.cpp:1002:76: warning: writing into constant object (argument 3) [-Wformat=]
int res = sscanf(line, "%s %lf %lf",temp_string.c_str(),&temp_kb,&temp_kt);
                                                                        ^

当然有道理,因为c_str()返回一个常量指针。如果没有警告,这样做的正确方法是什么?

非常感谢, 费迪南

编辑: res的值是需要进一步控制的,所以我必须简单地重写我的代码,以便它不使用它。这不是什么大不了的事,但它会等到明天。谢谢你们:-)非常感谢你的帮助。

2 个答案:

答案 0 :(得分:4)

由于您的输入是以空格分隔的,因此您可以使用文件流的>>运算符读取输入。

std::ifstream fin("my_file_to_read");
std::string data;
double a, b;
fin >> data >> a >> b;

以上将采取

65-82 0.015 0.655

从文件中输入65-82data然后在空格处停止。然后0.015被添加到a,然后停留在该空格,然后0.655被添加到b

如果您想确保每行有3个值,则输入以数字开头,那么您需要使用std::getline从文件中读取整行。然后,您可以将该行加载到std::stringstream并检查提取是否成功。

std::ifstream fin("my_file_to_read");
std::string data, line;
double a, b;
std::getline(fin, line);
std::stringstream ss(line);
if (!(ss >> data >> a >> b))
{
    //error handling code here
}

答案 1 :(得分:1)

在C ++中,您通常会执行以下操作:

std::istringstream stream(line);
std::string temp_string;
double temp_kb, temp_kt;
if (!(stream >> temp_string >> temp_kb >> temp_kt)) {
    // unable to read all values. handle error here
}

你不能写那样的字符串对象。如果你真的想要使用sscanf(),那么你需要使用char[]数组,之后可能会将其转换为string