【问题标题】:C++ and printf - strange character outputC++ 和 printf - 奇怪的字符输出
【发布时间】:2011-10-14 15:12:37
【问题描述】:

我对 C++ 完全陌生,但对 Java、C#、JavaScript、VB 不是。我正在使用 Visual Studio 2010 中的默认 C++ 控制台应用程序。

在尝试执行 printf 时,我得到了一些奇怪的字符。每次都不一样,这告诉我每次运行它时他们可能正在查看不同的内存位置。

代码:

#include "stdafx.h"
#include <string>

using namespace std;

class Person
{
public:
    string first_name;
};

int _tmain(int argc, _TCHAR* argv[])
{
    char somechar;
    Person p;
    p.first_name = "Bruno";

    printf("Hello %s", p.first_name);
    scanf("%c",&somechar);
    return 0;
}

【问题讨论】:

  • 在 C++ 中使用 cout。对于带有 %s 的 printf,您需要 p.first_name.c_str(),但不要在 C++ 中使用 printf。

标签: c++ console-application printf


【解决方案1】:

问题是printf/scanf 不是类型安全的。您提供了一个 std::string 对象,其中 printf 需要一个 const char*。

解决这个问题的一种方法是编写

printf("Hello %s", p.first_name.c_str());

但是,由于您使用 C++ 进行编码,因此最好使用 I/O 流而不是 printf/scanf:

std::cout << p.first_name << std::endl;
std::cin >> c;

【讨论】:

  • 谢谢+1。那么在 C++ 中有没有等价于 printf 的格式呢?
【解决方案2】:

将字符串转换为 c 字符串。

printf("Hello %s", p.first_name.c_str()); 

此外,由于您使用的是 C++,因此您应该了解 cout 而不是 printf!

【讨论】:

  • +1 用于回答问题,然后将他推向正确的方向。
【解决方案3】:

使用printf("Hello %s",p.first_name.c_str());!

【讨论】:

    【解决方案4】:
    printf("Hello %s", p.first_name.c_str());
    

    但是,如果您使用的是 c++,为什么不使用 iostream?

    【讨论】:

    • +1 因为我是个新手。在我们说话的时候,我再次拿出我的 C++ 书籍。
    • 因为与 printf() 相比,iostream 非常非常非常非常慢。做了很多你不需要的事情。谷歌!
    【解决方案5】:

    您不能将 C++ std::string 对象传递给 printf。 printf 只理解 int、float 和 char* 等基本类型。你的编译器应该在那里给你一个警告;如果不是,请提高警告级别。

    由于您使用的是 C++,因此您确实应该使用 std::cout 进行文本输出,这确实理解 std::string 对象。如果你真的因为某种原因必须使用printf,那么通过调用c_str() 方法将std::string 转换为const char*。

    【讨论】:

      【解决方案6】:

      printf("%s") 接受以'\0' 结尾的 c 样式字符串。但是,string 对象是 C++ 对象,它不同于 c 样式的字符串。您应该使用重载的std::cout 直接处理string 类型,如下所示。

      std::cout << p.first_name;
      

      【讨论】:

      • 好的,所以你演示了如何输出名字。 “你好”这个词呢?
      • @Jim,对于“Hello” OP 已经用 printf 做对了。您应该尝试确定问题的主要部分,而忽略其他琐碎的部分。对吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多