1. 程式人生 > >C++ string的c_str函式極易產生bug, 有陷阱, 請慎用---強烈建議用strncpy來拷貝c_str

C++ string的c_str函式極易產生bug, 有陷阱, 請慎用---強烈建議用strncpy來拷貝c_str

      string的c_str函式很怪異很危險, 先來看一個簡單的例子:

#include <iostream>
#include <string>
using namespace std;

int main()
{
	string s = "abc";
	const char *p = s.c_str();
	cout << p << endl; // abc

	s = "xyz";
	cout << p << endl; // 居然是xyz


	return 0;
}
       看看吧, c_str確實很怪異, 網上有很多網友遇到類似更多的問題, 久久才定位出來
。 我們看看, 那要怎麼搞才能避免類似錯誤呢? 我們可以考慮進行如下修改:
#include <iostream>
#include <string>
using namespace std;

int main()
{
	string s = "abc";
	char szStr[1024] = {0};
	strncpy(szStr, s.c_str(), sizeof(szStr) - 1); // 強烈建議拷貝出來
	
	const char *p = szStr;
	cout << p << endl; // abc

	s = "xyz";
	cout << p << endl; // abc


	return 0;
}
       最後, 我還是要強調一下:標準string中c_str的實現很怪異, 希望大家用的時候一定要小心, 強烈建議用strncpy拷貝出來, 拷貝出來, 然後你愛用咋用。