c ++如何打印另一种类型变量的String属性值?

时间:2015-04-27 14:09:02

标签: c++ string

我想在控制台中显示C ++ String的值 - 但是特定的String没有独立定义 - 它是另一种类型的变量的属性...我目前正试图用它来显示它的值是:

printf("\n CSARSixSectorItem.cpp line 530. rm_WPSequence[liSARIndex -1]: %s", rm_WPSequence[liSARIndex-1].rm_RefPointDB->m_Name);

在引号之外,我将变量rm_WPSequence[liSARIndex-1].rm_RefPointDB->m_Name传递给%s中的printf

m_Name是String类型的变量,定义为:

std::string m_Name;

rm_RefPointDB是指向CGenericRefPoint的指针,定义为:

CGenericRefPoint * rm_RefPointDB;

和rm_WPSequence是vector定义的:

vector< CUserWaypointListElement > rm_WPSequence;

但是,虽然我尝试显示的实际变量是string,但是当在控制台中打印行时,我没有给出字符串的内容,但是有一些不可读的字符,例如{ {1}} ...每次打印行时,显示的字符都会更改。我想知道这是因为L,%是另一个变量的成员吗?如果是这样,我如何显示String的值?我真的不想知道它的父变量,但是我还需要做些什么才能自己访问String?

2 个答案:

答案 0 :(得分:2)

使用std string的c_str()函数传递给%s:

printf("\n CSARSixSectorItem.cpp line 530. rm_WPSequence[liSARIndex -1]: %s", rm_WPSequence[liSARIndex-1].rm_RefPointDB->m_Name.c_str());

说明:%s期望显示char *类型。您正在传递一个std :: string,它是Class Type。

c_str()返回一个指向std :: string包含的char *缓冲区的指针。

答案 1 :(得分:0)

解决方案

使用std::string的{​​{1}}格式打印printf时,您应使用%s c_str()方法,如下所示:

std::string

您正在使用C风格的输出方式rm_WPSequence[liSARIndex-1].rm_RefPointDB->m_Name.c_str() ,因此应使用C风格的参数来打印字符串。

c_str()printf的成员函数。它返回一个指向数组的指针,该数组包含一个numm终止的字符序列,表示字符串对象的当前值。这是包含名称字符串字符的实际std::string数组。这是字符串的C风格,

注意编译器的警告或错误

对于这个问题,最新的稳定版本的编译器会给你一个错误。注意这些可以节省你的大量时间。

对于以下测试代码,clang ++和g ++都会出错。对于char函数调用,它们不允许将non-POD对象作为...传递。

printf
Clang ++输出
#include <string>
#include <cstdio>
#include <iostream>

using namespace std;
int main() {
  string a("This is a string");
  printf("0x%x, 0x%s, 0x%x\n", a, a , &a);
  cout << a << endl;
  return 0;

}
g ++输出
$ clang++ Stringcstring.cpp 
Stringcstring.cpp:26:32: error: cannot pass non-POD object of type 'string' (aka 'basic_string<char>') to
      variadic function; expected type from format string was 'unsigned int' [-Wnon-pod-varargs]
  printf("0x%x, 0x%s, 0x%x\n", a, a , &a);
            ~~                 ^
Stringcstring.cpp:26:35: error: cannot pass non-POD object of type 'string' (aka 'basic_string<char>') to
      variadic function; expected type from format string was 'char *' [-Wnon-pod-varargs]
  printf("0x%x, 0x%s, 0x%x\n", a, a , &a);
                  ~~              ^
Stringcstring.cpp:26:35: note: did you mean to call the c_str() method?
  printf("0x%x, 0x%s, 0x%x\n", a, a , &a);
                                  ^
                                   .c_str()
Stringcstring.cpp:26:39: warning: format specifies type 'unsigned int' but the argument has type
      'string *' (aka 'basic_string<char> *') [-Wformat]
  printf("0x%x, 0x%s, 0x%x\n", a, a , &a);
                        ~~            ^~
1 warning and 2 errors generated.

为什么你看到无意义的字符输出

您的对象,$ g++ Stringcstring.cpp Stringcstring.cpp: In function ‘int main()’: Stringcstring.cpp:26:41: error: cannot pass objects of non-trivially-copyable type ‘std::string {aka class std::basic_string<char>}’ through ‘...’ printf("0x%x, 0x%s, 0x%x\n", a, a , &a); ^ Stringcstring.cpp:26:41: error: cannot pass objects of non-trivially-copyable type ‘std::string {aka class std::basic_string<char>}’ through ‘...’ Stringcstring.cpp:26:41: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 4 has type ‘std::string* {aka std::basic_string<char>*}’ [-Wformat=] rm_WPSequence[liSARIndex-1].rm_RefPointDB->m_Name类的对象。对于std::string的{​​{1}}格式,它接受的只是printf的数组,或者它会尝试将%s内存中的char对象解释为std::string ,这就是为什么你看到一些无意义的字符输出。