使用int值填充char数组

时间:2017-07-21 13:20:47

标签: c++ arduino

我正在使用一个带有我需要调用的函数的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 ++专家,我们将非常感谢任何帮助。

谢谢!

2 个答案:

答案 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();
}

那就是它!它现在有效:)