gpt4 book ai didi

c++ - 将字符串数组传递给方法

转载 作者:太空宇宙 更新时间:2023-11-04 15:15:49 24 4
gpt4 key购买 nike

我是C++的初学者,以前用过C,但没用过C++。这是我的第一个程序,它应该做一些非常简单的事情,但是我什至无法在方法之间传递字符串......当我用字符串数组调用方法 setMode 时,方法实例收到一个空数组,而不是我发送的数组。为什么会这样?

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>

using namespace std;

#define LED_PATH "sys/class/leds/beaglebone:green:usr"

class LED{

private:
string path;
int number;

public:
LED(int number);
virtual void setMode(string mode[]);
virtual ~LED();
};


LED::LED(int number){
ostringstream fs;
this->number = number;
fs << LED_PATH << number;
this->path = string(fs.str());

cout << this->path << endl;
}

LED::~LED(){

}

void LED::setMode(string mode[]){
//Will use all fields of mode[] in the future
cout << "setMode: mode: " << mode[0].c_str() << endl;

}


int main(int argc, char* argv[]){

LED LEDs[4] = {LED(0), LED(1), LED(2), LED(3)};
string mode[argc-1];

//TODO Perform argc value safety check
for(int i=1; i<argc; i++){
mode[i] = string(argv[i]);
cout << mode[i].c_str()<<endl;
}

for(int i=0; i<4; i++){
LEDs[i].setMode(mode);
}

return 0;

}

输出:

debian@beaglebone:~/Desktop/LED_Cpp$ ./led on 1
sys/class/leds/beaglebone:green:usr0
sys/class/leds/beaglebone:green:usr1
sys/class/leds/beaglebone:green:usr2
sys/class/leds/beaglebone:green:usr3
on
1
setMode: mode:
setMode: mode:
setMode: mode:
setMode: mode:

最佳答案

string mode[argc-1];

这使用专有的 GCC 扩展。在标准 C++ 中,原始数组的大小必须在编译时已知。

你需要这样的东西:

if (argc < 4) {
std::cerr << "error\n";
return EXIT_FAILURE;
}
string mode[4];

或者,更可取,使用 std::vector:

std::vector<std::string> mode(argc-1);
for(int i=1; i<argc; i++){
mode[i] = string(argv[i]);
cout << mode[i].c_str()<<endl;
}

这将使 mode[0] 为空。

for(int i=0; i<4; i++){
LEDs[i].setMode(mode);
}

传递给 setMode 的数组(或 std::vector)因此总是第一个元素是空字符串。

void LED::setMode(string mode[]){

这是尝试将数组传递给函数。实际发生的情况是传递了指向第一个元素的指针,并且大小信息丢失了

传递包含其大小信息的原始数组的正确方法是使用引用:

 void LED::setMode(string (&mode)[4])

但正如我之前提到的,只需使用 std::vector 就可以了。当你需要修改 vector 时,通过&传递,否则通过const&传递:

 void LED::setMode(std::vector<std::string> const& mode)

无论哪种情况,在方法内部,您当前只访问第一个元素:

cout << "setMode: mode: " << mode[0].c_str() << endl;

正如我们之前建立的那样,mode[0] 始终为空。这就是什么都不打印的原因。

关于c++ - 将字符串数组传递给方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33451564/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com