将字符串数组传递给方法

时间:2015-10-31 12:25:55

标签: c++

我是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:

2 个答案:

答案 0 :(得分:5)

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);
}

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

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]始终是空的。这就是为什么没有印刷的原因。

答案 1 :(得分:2)

你是一个人。您正在写信

mode[1]

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

你使用

mode[0] 

输出。