在C#中我可以很容易地通过一个字符串数组进行枚举,但是我很难理解为什么下面的代码在C ++中不起作用
int main( int argc, char ** argv )
{
string hi[] = { "hi", "cool", "what" };
for (string s : hi)
{
printf("%s \n", s);
}
return 0;
}
我确信答案很简单。有帮助吗?
另外,我尝试使用它,但也不起作用:
printf(s);
奇怪的是,整数上的数组确实有效但使用%d
。是的,我确实有#include <string>
@chris提供的错误信息(由clang编译器生成):
main.cpp:12:25:错误:无法将类型为'string'(又名
'basic_string<char, char_traits<char>, allocator<char> >'
)的非平凡对象传递给variadic函数;格式字符串的预期类型是'char *'[-Wnon-pod-varargs]printf("%s \n", s); ~~ ^
main.cpp:12:25:注意:你的意思是调用c_str()方法吗?
printf("%s \n", s); ^ .c_str()
答案 0 :(得分:3)
使用std::cout
代替printf
问题是,当您确实需要std::string
时,您将printf
传递给const char*
。使用std::string::c_str
解决了这个问题。但最好不要首先使用printf
。
#include <iostream>
#include <string>
int main(int argc, char** argv)
{
std::string hi[] = { "hi", "cool", "what" };
for (const std::string& s : hi) {
std::cout << s << std::endl;
}
return 0;
}
答案 1 :(得分:1)
您可以使用每个字符串的c_str()
属性(它返回char*
printf
知道如何正确打印的指针:
for (string s : hi)
{
printf("%s \n", s.c_str());
}
考虑到printf
是旧C
输入输出设施的一部分。虽然它们在大多数情况下都能正常使用,但最好不要将它们与C ++流混合使用(std :: cin,std::cout),更好的是使用更多advanced facilities较新的<iostream>
课程:
for (std::string s : hi)
{
std::cout << s;
}
答案 2 :(得分:1)
问题是printf
(本机c函数)期望获得一个c字符串(即char*
,这是由&#39; \ 0&#39;终止的字符序列。而不是类型string
的对象,它是C ++类型。
但是,您只需使用字符串上的string
方法将c_str()
转换为c字符串,即将原始调用更改为printf
至printf("%s \n", s.c_str());
< / p>
或者,您可以使用C ++标准方式使用std::cout
打印到控制台(其他答案中提供了一些示例)。