C++字符[100] = "hello"不起作用

C++ char[100] = "hello" doesn't work

本文关键字:hello 不起作用 字符 C++      更新时间:2023-10-16

有没有更好、更短、更容易阅读的以下代码版本:

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++中最著名的不安全函数之一。它可以写过缓冲区的末尾,导致缓冲区溢出错误。在您的特定示例中没有问题,但一般情况下仍应避免使用。