我检查argv[1]
中的参数是否对我的文件有效。
我在自己的子程序中有一个菜单系统,名为main。
读取文件等是在与第一个分开的另一个子例程中完成的,也在main中调用。
如何将argv[1]
转移到第一个子程序?甚至是第二个?
string sArgInit = argv[1];
这样我可以使用C-String打开文件。
但是我无法将字符串输入到main之外的任何函数中。
有没有办法在没有: 全局变量, 将字符串作为参数参数传递给子例程。
答案 0 :(得分:6)
以下代码显示了如何正确执行所需操作,检查argv [1]是否存在,然后将其作为C char-pointers或C ++字符串传递给函数并使用该函数中的值。
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
static void f1 (char *s) {
cout << "1: " << s << endl;
}
static void f2 (const string& s) {
cout << "2: " << s << endl;
cout << "3: " << s.c_str() << endl;
}
int main (int argc, char *argv[]) {
if (argc < 2) {
cout << "Usage: " << argv[0] << " <test_string>" << endl;
return EXIT_FAILURE;
}
char *s1 = argv[1];
string s2(argv[1]);
f1 (s1);
f2 (s2);
return EXIT_SUCCESS;
}
正如预期的那样输出:
1: hello
2: hello
3: hello
对于您的编辑,如果不将argc / argv存储在全局或将其传递给函数,则无法访问它。那是因为它们作为参数传递给main
函数,因此该函数本身就是本地的。
答案 1 :(得分:2)
有没有办法在没有: 全局变量,传递字符串 作为参数的参数 子例程。
不,你必须以某种方式进入常规。
将其作为参数传递有什么问题?
void my_sub( char* s){}
void main(int argc, char* argv[])
{
my_sub( argv[1] );
}
答案 2 :(得分:1)
const char *filename = argv[1];
然后将指针传递给子程序。 argv [1]对整个程序的执行仍然有效。
答案 3 :(得分:0)
首先,在尝试将其分配给C ++字符串之前,您可能需要检查argv [1]是否为空。
您可以将C ++字符串对象移动到函数中。
最终,您可以使用c_str()创建C字符串
例如: char * sData =(char *)str.c_str()
答案 4 :(得分:0)
您必须将参数作为参数传递给子例程。
void method1(char* filename) {
// ..
}
void method2(char* filename) {
// ...
}
void main(int argc, char* argv[]) {
method1(argv[1]);
method2(argv[1]);
}
我不确定这是否能回答你的问题,所以请扩展。
答案 5 :(得分:0)
class myprog {
public:
myprog(const string& filename) : m_filename(filename) {}
void menufunc();
void otherfunc();
private:
string m_filename;
};
int main(int argc, char** argv)
{
myprog prog(argv[1]);
prog.menufunc();
prog.otherfunc();
return 0;
}