我正在使用一个带有我需要调用的函数的Arduino项目的库。此函数只接受const char*
类型的一个参数。我们称之为 foo 。
我需要将一些int
值传递给 foo ,因此我首先使用sprintf
转换它们。到目前为止一切都很好。
当我尝试使用转换为int
的{{1}}值填充数组,然后使用数组中的每个值调用 foo 时出现问题。
我希望这能更好地解决问题:
char
该代码的输出如下:
#include <iostream>
using namespace std;
// This function cannot be modified because
// is a part of a library
void foo(const char *bar){
cout << "Result: " << bar << endl;
}
int main() {
char *values[10]; // My array of values
char tmp[10]; // Temporary buffer for the int > char conversion
for(int i = 0; i < 10; i++){
int samplevalue = i * 2; // Just a sample value, not important
sprintf(tmp, "%d", samplevalue); // Copy the sample value to the temporary buffer
values[i] = tmp; // Assign the value of the temp var to a position in my values array
cout << values[i] << endl;
}
cout << "==============" << endl;
// Here comes the problem:
for(int i = 0; i < 10; i++){
foo(values[i]);
}
return 0;
}
如您所见,所有结果行都等于分配给0
2
4
6
8
10
12
14
16
18
==============
Result: 18
Result: 18
Result: 18
Result: 18
Result: 18
Result: 18
Result: 18
Result: 18
Result: 18
Result: 18
var的最后一个值。我想是的,因为tmp
数组中的每个值都包含一个指向tmp变量的指针而不是它的实际值。
我希望在每个结果行中使用不同的数字,就像在第一个values[10]
循环中一样。
我想很明显,我甚至不能成为C ++专家,我们将非常感谢任何帮助。
谢谢!
答案 0 :(得分:1)
#include <iostream>
using namespace std;
// This function cannot be modified because
// is a part of a library
void foo(const char *bar)
{
cout << "Result: " << bar << endl;
}
int main(void)
{
std::string values[10]; // My array of values
char tmp[10]; // Temporary buffer for the int > char conversion
for (int i = 0; i < 10; i++) {
int samplevalue = i * 2; // Just a sample value, not important
sprintf(tmp, "%d", samplevalue); // Copy the sample value to the temporary buffer
values[i] = tmp; // Assign the value of the temp var to a position in my values array
cout << values[i] << endl;
}
cout << "==============" << endl;
// Here comes the problem:
for (int i = 0; i < 10; i++) {
foo(values[i].c_str());
}
return 0;
}
指针和数组不是字符串。请改用values
。
tmp
使用数组时,values
数组中的所有指针都指向fprintf(stdout, "%p\n", values[i]);
,您可以通过循环遍历sprintf()
并打印此地址来检查
tmp
因此,values[i] = tmp;
将values[i]
转换为tmp
所有值,将打印的值始终是最后一个,
values[i]
仅使tmp
指向std::string
,因此当您访问values[i]
时,您确实可以访问sprintf()
。
发生#include <iostream>
#include <vector>
#include <sstream>
// This function cannot be modified because
// is a part of a library
void foo(const char *bar)
{
std::cout << "Result: " << bar << std::endl;
}
int main(void)
{
std::vector<std::string> values;
for (int i = 0; i < 10; i++) {
values.push_back(std::to_string(2 * i));
std::cout << values[i] << std::endl;
}
std::cout << "==============" << std::endl;
for (size_t i = 0; i < values.size(); i++) {
foo(values[i].c_str());
}
return 0;
}
次复制。
此外,您应该使用字符串流直接将数字写入每个values
,因为std::vector
非常危险。
或者甚至更好地使用像这样的真正的c ++解决方案,
{{1}}
请注意,现在,您可以更改{{1}}中的元素数量,如果需要,可以将其用作数组,只需阅读{{1}}的文档。
答案 1 :(得分:-1)
好的,我终于让它运转起来了。在Arduino中,字符串声明为String variable;
,c_str()
函数将字符串转换为const char *
,因此我将int
数字转换为String
,然后到const char *
:
for(int i = 0; i < 10; i++){
String tmp = String(i * 2);
values[i] = tmp.c_str();
}
那就是它!它现在有效:)