如何将字符串转换为字符 * 数组
How to convert string into char * array
我已经更改了我的代码,现在在编译时会发生这些错误:
`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;
}
text.c_str()
将std::string
转换为const char*
。看这里。
为了详细说明我的答案,有很多方法可以创建您需要的数组,但这已经在这里、这里、这里和这里进行了描述。一个不涉及STL的new
/malloc
或密集使用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
函数退出时为你这样做。
简而言之,你有一个数组 argv,其中包含 100 个指向字符串的指针,其中只设置了第一个。 argv[1] 没有设置为任何内容,所以指向某个地方是随机的。在这种情况下,是非法的。
此外,getoption所期望的将更像这样:
argv[0] = "progname";
argv[1] = "-f";
argv[2] = "input.gmn"
argv[3] = "-output.jpg"
argv[4] = 0
注意末尾的 =0 以通过随机内存位停止 getoption 字符
代码的第一个错误是比较:
for (int i=0; i<=stringLength; i++) {
arv[i]=text[i];
}
使用 i< stringLength
而不是 i<=stringLength
。
第二个错误是arv
不是以 null 结尾的。
修复这两个错误后,您的代码应如下所示:
for (int i=0; i < stringLength; i++) {
arv[i]=text[i];
}
arv[stringLength] = ' ';
顺便说一下,getopt
的正确函数签名是这样的:
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:?");
无需任何转换,使用手动循环。
- 指向指向字符数组的指针数组的指针
- 比较字符数组
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用无符号字符数组有效存储内存
- 错误:字符数组的初始值设定项太多
- 对字符数组中的元素执行逐位操作
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- C++ 传递二维字符数组
- 无法在 C++ 中输入字符数组
- 字符数组中的元素数
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 使用字符数组作为 Map 中的键
- C++:__aligned(__alignof__) 导致字符数组数据出现问题?
- 按顺序声明的字符数组重叠
- 在 C++ 中字符串的大小与字符数组的大小
- 寻找一种更好的方法来表示无符号字符数组
- 如何打印 2D 字符数组C++
- 从字符数组的元素中减去'a'是什么意思
- 我是否不正确地集中了这些字符数组?