簡體   English   中英

C ++ char [100] =“ hello”不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM