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