将字符串数组传递给方法
Pass string array to method
我是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]
用于输出。
相关文章:
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 具有字符串化的可变参数宏的现代/通用方法
- 接收字符串并使用它来调用方法C++
- 如何分隔字符串并将标记传递给方法
- 是否有通用方法可以找到任何以 null 结尾的字符串的长度?
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 在 C++11 中字符串化变量名称的替代方法
- 连接和压缩标准::vector<std::字符串的最佳方法>
- Esp8266 & Nodemcu:返回请求字符串的方法
- 将位字符串转储到二进制文件的最佳方法是什么
- 有没有一种 STL 方法可以找到字符串的所有排列,给出一个以 C++ 为单位的大小?
- 如何将字符串从 C++/CLI 方法返回到调用它的非托管C++
- 创建字符串数组的有效方法
- 如何使用字符串::replace方法写入文件
- 是否有更有效的方法来生成日期的REGEX字符串
- C++-将对象(如字符串)映射到表中成员函数的正确方法
- 有没有更快的方法从成员函数返回格式化字符串
- 有没有一种方法可以在不复制数据的情况下从string_view创建字符串流
- 从c++中的类指针对象调用方法(字符串)