相关疑难解决方法(0)

std :: string :: c_str()和temporaries

以下C++代码是否格式良好:

void consumer(char const* p)
{
  std::printf("%s", p);
}

std::string random_string_generator()
{
  // returns a random std::string object
}

consumer(random_string_generator().c_str());
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,在创建临时std :: string对象并获取c_str()指针后,没有什么能阻止std :: string对象被破坏(或者我错了?).如果代码一切正常,你能指点我的标准吗?当我使用g ++进行测试时,它确实有效.

c++ stl stdstring

56
推荐指数
3
解决办法
7924
查看次数

为什么这样做:从std :: string函数返回C字符串文字并调用c_str()

我们最近在大学里做了一个讲座,我们的教授告诉我们在使用不同语言编程时需要注意的不同事项.以下是C++中的一个示例:

std::string myFunction()
{
    return "it's me!!";
}

int main(int argc, const char * argv[])
{
    const char* tempString = myFunction().c_str();

    char myNewString[100] = "Who is it?? - ";
    strcat(myNewString, tempString);
    printf("The string: %s", myNewString);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这会失败的原因是return "it's me!!"使用char []隐式调用std :: string构造函数.该字符串从函数c_str()返回,函数返回指向数据的指针std::string.

由于函数返回的字符串未在任何地方引用,因此应立即取消分配.这就是理论.

但是,让这段代码运行没有问题.很想知道你的想法.谢谢!

c++

43
推荐指数
2
解决办法
4528
查看次数

在函数调用中临时:UB?

根据以下答案考虑以下代码:

#include <iostream>
#include <sstream>

class StringBuilder {
public:
    template <typename T> inline StringBuilder &operator<<(T const &t) {
        ss << t;
        return *this;
    }

    inline char const * c_str() {
        return ss.str().c_str();
    }

private:
    std::stringstream ss;
};

void foo(const char *x) {
    std::cout << x << std::endl;
}

int main() {
    foo((StringBuilder() << "testing " << 12 << 3 << 4).c_str());
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

foo()使用临时StringBuilder的返回值调用是否会以任何方式导致UB?

我问的原因是上面的例子效果很好,但在现实生活中,我使用的是一个库,其中包含日志工具,使用这个库我会得到不正确的输出(日志功能需要我的char*正确但在内部覆盖它,这使我相信内存不再有效).

c++ undefined-behavior language-lawyer

4
推荐指数
1
解决办法
90
查看次数

stringstream和多线程

我是多线程和C++的新手,在尝试在我的应用程序中使用保存文件的线程时遇到问题.代码如下:

#include <iostream>
#include <thread>
#include <fstream>
#include <vector>
#include <sstream>

using namespace std;

void writeCSV(vector<vector<double> > & vec, const char* filename) {

    ofstream output(filename);

    for (vector<vector<double> >::const_iterator i = vec.begin(); i != vec.end(); ++i) {
        for (vector<double>::const_iterator j = i->begin(); j != --i->end(); ++j) {
            output << *j << ", ";
        }
        output << *(--i->end()) << "\n";
    }


}

void testFn(int id) {
    std::ostringstream filename;
    vector<vector<double> > v(460, vector<double>(460,0));
    filename << "test" << id << ".csv";
    const char* fileStr …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading ostringstream ofstream

2
推荐指数
2
解决办法
787
查看次数

snprintf c ++替代方案

如何将此代码从C转换为C++?

char out[61]; //null terminator
for (i = 0; i < 20; i++) {
    snprintf(out+i*3, 4, "%02x ", obuf[i])
}
Run Code Online (Sandbox Code Playgroud)

我找不到任何替代方案snprintf.

c++ printf string-formatting c++11

1
推荐指数
1
解决办法
5488
查看次数