2012-06-29 83 views
1

我想一个int转换为一个CString。我决定通过stringstream将int读入常规字符串,然后将字符串读入char数组。以下似乎工作,但我想知道如果我只是幸运地与我的编译器。代码看起来好听吗?谢谢!将字符串转换到C风格的字符串

int zip = 1234;  

char zipString[30]; 

stringstream str; 

str << zip; 

str >> zipString; 

cout << zipString; 
+1

更好地推动这一问题http://codereview.stackexchange.com/ – ArtemStorozhuk

+0

你需要有字符串作为C-字符串,而不是一个'的std :: string'任何理由吗?后者通常是一个更好的选择,除非你被传统代码所束缚。 –

+0

我需要独立处理字符串中的每个'整数'。看起来像一个数组可以让我选择它们以便最简单。 – AlmostSurely

回答

4

您可以从流的str()功能得到了C++ std::string,并从字符串的c_str()功能的不可变的C风格的0结尾的字符串:

std::string cpp_string = str.str(); 
char const * c_string = cpp_string.c_str(); 

你可能想将这些组合成单个表达式,str.str().c_str(),但那将是错误;在你用指针做任何事情之前,C++字符串将被销毁。

你在做什么都可以工作,只要你确定缓冲区足够大;但使用C++字符串消除了溢出缓冲区的危险。一般来说,除非需要使用需要它们的API(或者在极端情况下,作为避免内存分配的优化),否则最好避免使用C风格的字符串。 std::string通常更安全,更易于使用。

+0

谢谢!出于好奇,你会建议不要做我所做的事吗? – AlmostSurely

+0

你是对的!我想'stringstream.str()''返回的std :: string&','不是的std :: string' :) – dasblinkenlight

+1

@IniquiTrance:一般来说,我会建议使用'的std :: string'字符串,除非有令人信服的理由使用别的东西。 –

1

std::stringc_str()成员函数返回const char*(又名C风格的字符串)。

std::string str = "world"; 
printf("hello, %s", str.c_str()); 
2

除非你有一个特定的原因,你需要一个字符数组而不是标准字符串,我会使用后者。虽然这不是绝对必要在这种情况下,我还通常使用升压lexical_cast,而不是明确地搬东西通过一个字符串流来进行转换:

std::string zipString = lexical_cast<std::string>(zip); 

然后,如果你真的需要的结果作为C-样式字符串,你可以使用zipString.c_str()来获得(虽然它仍然以不同的方式 - 你不能修改返回的内容)。

在这种特定的情况下,它不会获得你很多,但是这一般顺序对转换统一使用增加了,如果你要做到这一点,你还不如在这里使用它。

+0

你获得快速失败的行为,这是很多。我从来没有见过整个组织检查流的失败位一致(包括@IniquiTrance)。 –

+0

@TomKerr:好点。 –