C++字符[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++中最著名的不安全函数之一。它可以写过缓冲区的末尾,导致缓冲区溢出错误。在您的特定示例中没有问题,但一般情况下仍应避免使用。
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 为什么 str != "hello" &&"goodbye"不起作用?
- ZMQ Hello World不起作用
- 为什么带有 URL 映射的 Hello World 不起作用
- C++字符[100] = "hello"不起作用