将字符串数组传递给方法

Pass string array to method

本文关键字:方法 字符串 数组      更新时间:2023-10-16

我是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 << "errorn";
    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,你就会没事的。当您需要修改矢量时,通过&传递,否则通过const&:

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

在任何一种情况下,在方法内部,您现在只访问第一个元素:

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

正如我们之前所确定的,mode[0]总是空的。这就是为什么什么都不印的原因。

你已经一个人离开了。您正在写信给

mode[1]

在中

for(int i=1; i<argc; i++){
    mode[i] = string(argv[i]);

并且你使用

mode[0] 

用于输出。