[英]C++ char[100] = “hello” doesn't work
是否有更好,更短,更容易閱讀的以下代碼版本:
char ar[100];
int main() {
//ar = "hello"; doesn't compile
ar[0] = 'h';
ar[1] = 'e';
ar[2] = 'l';
ar[3] = 'l';
ar[4] = 'o';
ar[5] = '\x00';
return 0;
}
注意: ar
的類型必須是char[100]
。 “真實”程序是:
#include <string>
#include <cstdarg>
#define TO_STRING_BUF_SIZE 100
char toStringBuf[TO_STRING_BUF_SIZE];
std::string toCptr_(const char * format, ...) {
va_list argzeiger;
va_start(argzeiger, format);
int16_t ret = vsnprintf(toStringBuf, TO_STRING_BUF_SIZE, format, argzeiger);
if(ret >= TO_STRING_BUF_SIZE - 1) {
//toStringBuf = "buffer too small";
} else if(ret < 0) {
//toStringBuf = "encoding error";
}
va_end(argzeiger);
std::string returning(toStringBuf);
return returning;
}
使用strcpy
函數復制C樣式的字符串。
strcpy(ar, "hello");
如其他人所述,您可以使用strcpy()
/ strncpy()
將字符串復制到char[]
緩沖區中。
但是,在此示例中,這實際上不是必需的。 您的函數返回一個std::string
,因此您實際上根本不需要char[]
。 這浪費了短消息的內存,長消息的限制以及線程不安全的條件(除非您使用本地緩沖區而不是全局緩沖區)。 嘗試以下方法:
#include <string>
#include <cstdarg>
std::string toCptr_(const char * format, ...)
{
std::string str;
va_list argzeiger;
va_start(argzeiger, format);
int ret = vsnprintf(NULL, 0, format, argzeiger);
if (ret < 0) {
str = "encoding error";
}
else {
str.resize(ret+1);
vsnprintf(&str[0], str.size(), format, argzeiger);
str.resize(ret);
}
va_end(argzeiger);
return str;
}
或者,至少:
#include <string>
#include <cstdarg>
#define TO_STRING_BUF_SIZE 100
std::string toCptr_(const char * format, ...)
{
char toStringBuf[TO_STRING_BUF_SIZE];
std::string str;
va_list argzeiger;
va_start(argzeiger, format);
int ret = vsnprintf(toStringBuf, TO_STRING_BUF_SIZE, format, argzeiger);
if (ret < 0) {
str = "encoding error";
}
else if (ret < TO_STRING_BUF_SIZE) {
str.assign(toStringBuf, ret);
}
else {
str.resize(ret+1);
vsnprintf(&str[0], str.size(), format, argzeiger);
str.resize(ret);
}
va_end(argzeiger);
return str;
}
使用strncpy()
,例如:
strncpy(toStringBuf, str_buf, TO_STRING_BUF_SIZE);
toStringBuf[TO_STRING_BUF_SIZE-1] = 0;
不要使用strcpy()
,因為它是C / C ++中最經典的不安全函數之一。 它可能在緩沖區末尾寫入數據,從而導致緩沖區溢出錯誤。 在您的特定示例中這不是問題,但通常仍應避免。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.