【问题标题】:printf() surprising console output [duplicate]printf()令人惊讶的控制台输出[重复]
【发布时间】:2013-09-20 11:02:27
【问题描述】:

休息几年后,我需要使用 C++ 进行开发。无论如何,按照我目前正在阅读的教程,我遇到了问题。编写以下代码-sn-p 后,我希望在控制台中看到“Hello World”,但我只能看到“Debug: StrangeChars”;什么地方出了错?

std::string myString("Hello World"); 
printf("* Debug: %s \n", myString);

【问题讨论】:

  • 这就是为什么有些人回避printf
  • 选择您可能找到的任何其他教程。 printf 不是 C++ 方式。
  • 你在对你的编译器撒谎:%s 格式说明符说你将传递char*
  • 为什么这被否决了?虽然这显然是初学者的问题,但问题非常精确,任何有经验的人都可以清楚地回答。对大多数人来说这不是一个有趣的问题,但问得很好。
  • @b.buchhold 由于重复,我对这个问题投了反对票。很容易找到。

标签: c++ printf


【解决方案1】:

printf 是一个 C 函数,需要一个 c 字符串,一个 char*,它只是一个指向字符串上下文所在内存位置的指针。它假定字符串一直到下一个 '\0' 字节,并将从作为指针传递的地址打印到该点(下一个'\0')的内存内容。

std::string 是一个有多个成员的类。除了实际的字符串之外,它还存储例如当前大小。此外,您没有传递指向字符串的指针。

如果您想将std::stringprintf 一起使用,您必须在字符串对象上调用c_str() 方法。此方法将字符串对象的内容返回为char* / c-string,并且应始终在将字符串对象与需要 c-strings 的 c-function 一起使用时使用。

printf("* Debug: %s \n", myString.c_str());

【讨论】:

    【解决方案2】:

    printf%s%引用的字符串类型与std::string不同。

    实际上,当指定printf 时,std::string 甚至都不存在。在 C++ 中,您应该改用 std::cout,它可以按预期工作:

    #include <iostream>
     [...]
    
    std::string myString("Hello World"); 
    std::cout << "* Debug: " << myString << " \n";
    

    【讨论】:

      【解决方案3】:

      试试

      printf("* Debug %s \n", myString.c_str());
      

      或者更好:

      std::cout << "* Debug " << mystring << std::endl;
      

      【讨论】:

        【解决方案4】:

        使用 myString.c_str();您正在尝试将对象输出为字符串。 std::string 和 char * 之间没有转换 *

        【讨论】:

          【解决方案5】:

          printf 依赖于您传递正确的参数。 %s 需要 char *,您传递了 std::string

          尝试(C方式)

          char myString[] = "Hello World";
          printf("* Debug: %s \n", myString);
          

          或者(混合 C/C++ 方式)

          std::string myString("Hello World"); 
          printf("* Debug: %s \n", myString.c_str());
          

          或者C++方式:

          std::string myString("Hello World"); 
          std::cout << "* Debug " << myString << std::endl;
          

          【讨论】:

          • +1 表示“C++ 方式”。其他两个选项应该被忽略,IMO。
          • @BretKuhns 这个问题原本也有 C 标签,但有人删除了。
          猜你喜欢
          • 2021-09-28
          • 2014-02-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多