为什么这个sprint语句崩溃了
Why this sprintf statement crashing?
char filebuf[256];
path current = current_path();
std::cout<<"CurrentWorking "<<current<<endl;
string _UserDir = "TTiTraceLogs";
sprintf(filebuf,"%s/%s",current,_UserDir); ///crashing here
如果我只格式化current
,那么就可以了。
sprintf(filebuf,"%s",current);
输出:CurrentWorking D:/working/eclipse_projects/sadftp/CollectTTiTraceSept10_1009_174
_higher/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/Release
在标准sprintf()
函数(和其他printf()
类函数)中,%s
指示符不能与c++ strings
一起工作;它只适用于c风格的字符串。试试_UserDir.c_str()
,它给你一个指向string
内部数组的const char *
,因此可以与许多C函数一起使用。
如果current_path()
返回的不是指向char
或unsigned char
的指针(可能是const
),您也需要转换该值
string
实际上是std::string
吗?path
和boost::filesystem::path
?在这种情况下,您应该知道C库函数(如sprintf
和printf
)不支持像std::string
这样的c++类。这是很自然的。
你需要做的是:
sprintf(filebuf, "%s%s", current.c_str(), _UserDir.c_str());
但是一个更优雅的解决方案,如果你已经在使用c++,是使用std::stringstream
或boost::format
。作为奖励,它不必在堆栈上分配缓冲区,也不必担心结果可能比缓冲区长(这可能导致缓冲区溢出和安全漏洞——sprintf()
可能是许多问题背后的罪魁祸首……)。
std:: stringstream
std::stringstream filebuf;
filebuf << current_path().c_str() << _UserDir;
std::string filename = filebuf.str();
boost::格式std::string filename = "%s%s" % current_path().c_str() % _UserDir;
顺便说一下,如果你只是想连接目录,使用boost::filesystem::path
的"正确"方法是:
boost::filesystem::path fullPath = current_path() / _UserDir;
是,/
操作符用于添加路径组件。毕竟它们是用斜杠隔开的,不是吗?
也就是说,如果你仍然不顾所有好的建议,选择使用旧的C库函数,请不要使用sprintf()
。使用稍微安全一点的snprintf(),它将最大缓冲区大小作为参数。
您的一些代码不清楚(例如:, path
类型到底是什么?),但看起来你试图通过c风格的字符串格式化器(sprintf %s
)打印std::string
,这是完全无效的。
看std::stringstream
。此外,对于简单的连接,std::string
提供了+
操作符重载。所以你可以简单地这样做:
current + "/" + whatever
sprintf只适用于char*,不能用于字符串。试试_UserDir.c_str(),应该没问题。
我不明白的是为什么你的编译器没有抱怨。您不能将std::string
或boost::filepath
等非pod类型作为变量传递;我的编译器说这将在运行时中止,任何编译器都会知道你正在将类类型传递给变量。(形式上,这是未定义的行为,但除非编译器以某种方式将其定义为扩展,否则它没有理由不发出警告。)
current不是一个char*指针,它是一个路径,所以它可能会导致复杂性
还有,sprintf不能像你想做的那样打印到字符串变量
current_path
有多长?可能是strlen(current_path)+strlen(_UserDir)+2 > 256
.
由于_UserDir
是c++ string
,您需要获得它的C字符串来调用sprintf()
,这是一个C函数。
sprintf(filebuf,"%s/%s",current,_UserDir.c_str()); // gets C string
还有,什么是path
?如果它不像char*
的typedef
,那么你也不能只sprintf()
。这可能是operator<<()
对path
过载,这就是std::cout
工作的原因。
%s
表示C字符串。你有一个c++字符串。您需要调用.c_str()
崩溃的原因已经解释过了——我只能添加一条建议——如果可能的话放弃sprintf,使用字符串流。它将使你的代码更好。您不必担心缓冲区的长度或遇到的其他错误。
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 我的简单if-else语句是如何无法访问的代码
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 为什么是0;C++中的有效语句
- 程序崩溃并显示"std::out_of_range"错误
- C++ 非 void 函数的崩溃没有返回语句
- C++:添加逻辑上正确的 if 语句会使我的程序崩溃
- C++在try-catch语句处崩溃
- C++-映射迭代器中的if语句导致程序崩溃的原因
- 使用 Qt5 的抛出语句时即时崩溃
- 由于 if 语句,C++ 程序崩溃
- 返回 std::string 的函数在没有 return 语句的情况下崩溃,这与返回 int 而不返回语句的函数不同
- 为什么我的程序在返回语句时崩溃
- C++ 随机 COUT 语句导致程序在重载的"="运算符内崩溃
- 程序因为if语句而崩溃
- 为什么当我忘记返回语句时,我的c++程序崩溃了,而不是仅仅返回垃圾
- 为什么这个sprint语句崩溃了