使用printf打印字符串值

时间:2015-04-25 20:56:48

标签: c# c++ arrays

在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()

3 个答案:

答案 0 :(得分:3)

使用std::cout代替printf 问题是,当您确实需要std::string时,您将printf传递给const char*。使用std::string::c_str解决了这个问题。但最好不要首先使用printf

Live working example

#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字符串,即将原始调用更改为printfprintf("%s \n", s.c_str()); < / p>

或者,您可以使用C ++标准方式使用std::cout打印到控制台(其他答案中提供了一些示例)。