Skip to content

[已解決][C++] cannot pass non-trivial object of type ‘std::__1::string’ (aka ‘basic_string<char, char_traits, allocator >’) to variadic function; expected type from format string was ‘char *’

Last Updated on 2021-10-22 by Clay

問題描述

在 C 語言當中,若是要印出字串型態的變數,我們經常會使用下列的語法:

#include <stdio.h>

int main() {
    char s[] = "Today is a nice day.";
    printf("%s\n", s);
    return 0;
}


Output:

Today is a nice day.



然後,若是在 C++ 中使用 String 型態的字串,便沒辦法這樣印出了。

#include <string>


int main() {
    std::string s = "Today is a nice day";
    printf("%s\n", s);
    
    return 0;
}


會產生以下報錯訊息:

error: cannot pass non-trivial object of type 'std::string' (aka
      'basic_string<char, char_traits<char>, allocator<char> >') to variadic
      function; expected type from format string was 'char *'
      [-Wnon-pod-varargs]
    printf("%s\n", s);
            ~~     ^
test.cpp:6:20: note: did you mean to call the c_str() method?
    printf("%s\n", s);
                   ^
                    .c_str()
1 error generated.


這個問題發生的原因其實很簡單:printf() 只支援 C 樣式的字串C-style String),並不支援如 std::string 的資料型態。


解決方法

解決方法大致有下列 3 種:

  • 使用 char s[] 重新方式重新定義你的字串
  • 使用 c_str() 轉換 std::string
  • 使用 cout 取代 printf()

其中 c_str() 的使用方法為 yourString.c_str()

#include <string>


int main() {
    std::string s = "Today is a nice day";
    printf("%s\n", s.c_str());
    
    return 0;
}


Output:

Today is a nice day

References


Read More

Leave a Reply