内部 for 循环:将文本和 int 转换为 const char* 并传递给函数
Inside for loop: Convert text and int to const char* and pass to function
我正在尝试在"for 循环"中将一些文本加上一个 int 转换为 const char*,然后将这个 const char* 传递给库中的函数(HTTPClient - mbed)。(库中的函数只接受 const char* 作为参数,它只是将 const char* 值添加到数组中,稍后使用 HTTP POST 发送这些值)。
这是我的代码:
for (int i = 0; i < 3; i++) {
char buf1[16];
char buf2[16];
char buf3[16];
sprintf(buf1,"%d",i);
sprintf(buf2,"Hello%d",i);
sprintf(buf3,"World%d",i);
const char* value1 = buf1;
const char* value2 = buf2;
const char* value3 = buf3;
map.put("id[]", value1);
map.put("test1[]", value2);
map.put("test2[]", value3);
}
但似乎在每个循环期间这些值都被覆盖,因此在执行 HTTP POST 时会发送以下值:
2你好
2世界2 2你好
2世界2 2你好
2世界2
而不是:
0你好0 世界0
1你好
1世界1 2你好
2世界2
我知道这与 const char* 是一个指针的事实有关,但我不确定如何解决它。
希望你们能帮到我。
谢谢!
在循环的每次迭代中,bufN
创建和销毁变量,但它们恰好是在堆栈上的同一地址创建的(否则循环会耗尽堆栈空间)。
看起来map.put
不会复制字符串,而是存储指向字符串的指针,即您的bufN
变量,这些变量在每次迭代时都会被新值覆盖,这就是您看到最后写入值的原因。
另请注意,循环终止后bufN
变量不再存在,因此存储在map
中的指针将变为无效。碰巧的是,这段记忆没有被其他东西覆盖。
解决方法是为所有缓冲区分配空间,例如:
constexpr int N = 3;
char bufs[N][3][16];
for(int i = 0; i < N; ++i) {
snprintf(bufs[i][0], sizeof bufs[i][0], "%d", i);
snprintf(bufs[i][1], sizeof bufs[i][1], "Hello%d", i);
snprintf(bufs[i][2], sizeof bufs[i][2], "World%d", i);
map.put("id[]", bufs[i][0]);
map.put("test1[]", bufs[i][1]);
map.put("test2[]", bufs[i][2]);
}
您需要确保map
在变量被销毁(超出范围)后不会尝试访问字符串bufs
。
相关文章:
- 在字符串函数中抛出'char const*'实例后调用的终止
- 双重标准?为什么只有 char* const&a = "bla" 的警告?
- 包括"lvtocon.h",未定义对'operator<<(std::ostream&, char const*)的引用
- 为什么 const char* const & = 可以编译"hello"?
- 将字符串文本常量定义为 char const* 和 wchar const*
- 如何将std::wstring转换为char const[]
- "char const * name() const _WEBSOCKETPP_NOEXCEPT_TOKEN_ {"剂量是什么意思
- 使用提升对字符串进行标记化时,将令牌转换为 char* const* 时失败
- 如何从 std::initializer_list<char const* 构建 std::vector<std::string>>
- 将 std::vector<std::string> 转换为 const char* const*
- 引发"char const*"错误的实例后调用的终止
- 将const char * const参数成员分配给新值
- 从'const char**'到'char* const*'的转换无效
- 从 sub_match<常量字符 *>' 转换为'const char *const &'
- char*const和constchar*之间有什么区别?(重复-需要更多澄清)
- 使用工厂方法时编译器错误:无法转换"const std::p air<char* const
- HEVC 解码器端口 Android 警告:从 'signed char*' 到 'char const* 的转换无效*
- 如何从'char const*'中删除常量
- 'char const *str'作为模板参数
- 为什么不;t strlen(.)应为const char*const str,而不是const char*