for 循环内部:将 text 和 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 Hello2 World2
2 Hello2 World2
2 Hello2 World2
而不是:
0 Hello0 World0
1 Hello1 World1
2 Hello2 World2
我知道这与 const char* 是一个指针这一事实有关,但我不确定如何解决它。
希望大家帮帮我
谢谢!
循环变量 bufN
的每次迭代都会被创建和销毁,但它们恰好是在堆栈上的相同地址创建的(否则循环会耗尽堆栈 space)。
看起来 map.put
没有复制字符串,而是存储指向字符串的指针,您的 bufN
变量,在每次迭代时都会被新值覆盖,这就是您看到的原因最后写入的值。
还要注意bufN
变量在循环结束后不复存在,所以map
中保存的指针失效。恰好这段记忆没有被其他东西覆盖。
解决方法是为所有缓冲区分配 space,例如:
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
变量被销毁(超出范围)后尝试访问字符串。
我试图在“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 Hello2 World2
2 Hello2 World2
2 Hello2 World2
而不是:
0 Hello0 World0
1 Hello1 World1
2 Hello2 World2
我知道这与 const char* 是一个指针这一事实有关,但我不确定如何解决它。
希望大家帮帮我
谢谢!
循环变量 bufN
的每次迭代都会被创建和销毁,但它们恰好是在堆栈上的相同地址创建的(否则循环会耗尽堆栈 space)。
看起来 map.put
没有复制字符串,而是存储指向字符串的指针,您的 bufN
变量,在每次迭代时都会被新值覆盖,这就是您看到的原因最后写入的值。
还要注意bufN
变量在循环结束后不复存在,所以map
中保存的指针失效。恰好这段记忆没有被其他东西覆盖。
解决方法是为所有缓冲区分配 space,例如:
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
变量被销毁(超出范围)后尝试访问字符串。