我已经更改了我的代码,现在编译时出现了这些错误:
`check.cpp: In function ‘int main()’:`
check.cpp:14:55: error: invalid conversion from ‘const char**’ to ‘char* const*’ [-fpermissive]
/usr/include/getopt.h:152:12: error: initializing argument 2 of ‘int getopt(int, char* const*, const char*)’ [-fpermissive]
int main() {
string text="-f input.gmn -output.jpg";
int argc=text.length();
cout<<"argc: "<<argc<<endl;
char const * argv = text.c_str();
cout<<"argv: "<<argv<<endl;
int c = getopt (argc, &argv, "f:s:o:pw:h:z:t:d:a:b:?");
return 0;
}
答案 0 :(得分:5)
您可以使用text.c_str()
将std::string
转换为const char*
。请参阅here。
要详细说明我的答案,有很多方法可以创建所需的数组,但这已经描述过here,here,here和here。一个简单的问题解决方案,不涉及new
/ malloc
或STL和istringstream
/ back_inserter
/ copy
的密集使用快速看起来像这样:
/* variables. */
std::vector< char* > argv;
int i, argc, state;
char c;
/* convert string to char string with automatic garbage collection. */
std::vector< char > tokens(text.begin(), text.end());
tokens.push_back(0);
/* tokenize string with space. */
for (state=0, argc=0, i=0; (c=tokens[i]); i++) {
if (state) {
if (c == ' ') {
tokens[i]=0;
state=0;
}
} else {
if (c != ' ') {
argv.push_back(&tokens[i]);
argc++;
state=1;
}
}
}
/* print argv. */
std::cout << "argc: " << argc << std::endl;
for (i=0; i < argc; i++) {
std::cout << "argv[" << i << "]: " << argv[i] << std::endl;
}
/* call getopt. */
c = getopt(argc, &argv[0], "f:s:o:pw:h:z:t:d:a:b:?");
这只是一个例子,但这种代码的一个优点是你可以使用其他字符作为分隔符,而不仅仅是空格,并且你不必关心释放分配的内存,因为std::vector
这样做为你在功能退出。
答案 1 :(得分:4)
您的代码的第一个错误是比较:
for (int i=0; i<=stringLength; i++) {
arv[i]=text[i];
}
使用i< stringLength
代替i<=stringLength
。
第二个错误是arv
不是以空值终止的。
修复两个错误后,您的代码应如下所示:
for (int i=0; i < stringLength; i++) {
arv[i]=text[i];
}
arv[stringLength] = '\0';
顺便说一下,getopt
的{{3}}就是这样:
int getopt(int argc, char * const argv[], const char *optstring);
将第二个和第三个参数作为const
。这意味着,你可以这样做:
char const * s = text.c_str();
int c = getopt (argc, &s, "f:s:o:pw:h:z:t:d:a:b:?");
无需任何转换,使用手动循环。
答案 2 :(得分:4)
简而言之,你有一个数组argv,其中包含100个指向字符串的指针,其中只有第一个指定。 argv [1]还没有被设置为任何东西,所以指向某个地方是随机的。在这种情况下,非法。
此外,getoption预计会更像这样:
argv[0] = "progname";
argv[1] = "-f";
argv[2] = "input.gmn"
argv[3] = "-output.jpg"
argv[4] = 0
注意最后的= 0通过随机的内存位来停止getoption chargins