【问题标题】:How to convert string into char * array如何将字符串转换为char *数组
【发布时间】:2012-05-16 22:40:02
【问题描述】:

我已经更改了我的代码,现在在编译时会出现这些错误:

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

【问题讨论】:

标签: c++ arrays string char


【解决方案1】:

您可以使用text.c_str()std::string 转换为const char*。见here

为了详细说明我的答案,有很多方法可以创建您需要的数组,但这已经在herehereherehere 中进行了描述。您的问题的简单解决方案不涉及 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 会为您执行此操作在函数退出时。

【讨论】:

  • A const char* 不是我们所需要的。 OP 需要const char*[]。多个字符串。
  • 我添加了解决问题的工作代码。可能更优雅,但涵盖了我能想到的所有极端情况。
【解决方案2】:

简而言之,您有一个数组 argv,其中包含 100 个指向字符串的指针,其中只有第一个被设置。 argv[1] 没有被设置为任何东西,所以随机指向某个地方。在这种情况下,是非法的。

此外,getoption 所期望的会更像这样:

argv[0] = "progname";
argv[1] = "-f";
argv[2] = "input.gmn"
argv[3] = "-output.jpg"
argv[4] = 0

注意末尾的 =0 以阻止 getoption 通过内存的随机位充电

【讨论】:

    【解决方案3】:

    您的代码的第一个错误是比较:

    for (int i=0; i<=stringLength; i++) {
       arv[i]=text[i]; 
    }
    

    使用i&lt; stringLength 而不是i&lt;=stringLength

    第二个错误是arv 不是以空值结尾的。

    修复两个错误后,您的代码应如下所示:

    for (int i=0; i < stringLength; i++) {
       arv[i]=text[i]; 
    }
    arv[stringLength] = '\0';
    

    对了,getoptcorrect function signature是这样的:

    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:?");
    

    无需任何转换,使用手动循环。

    【讨论】:

      猜你喜欢
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2019-08-04
      相关资源
      最近更新 更多