簡體   English   中英

如何將字符串轉換為char *數組

[英]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* 這里

要詳細說明我的答案,有很多方法可以創建所需的數組,但這已在此處此處此處此處進行了描述。 一個簡單的解決方案,它不涉及new / malloc或STL和istringstream / back_inserter / copy大量使用,而istringstream並沒有很快執行,可能看起來像這樣:

/* 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在功能上為您做到了出口。

您的代碼的第一個錯誤是比較:

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] = '\0';

順便說一句, 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:?");

無需任何轉換,使用手動循環。

簡而言之,您有一個argv數組,其中包含100個指向字符串的指針,其中僅設置了第一個。 argv [1]尚未設置為任何值,因此它指向的是隨機位置。 在這種情況下,是非法的。

此外,getoption期望的結果將更像這樣:

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

請注意,最后的= 0會停止通過內存的隨機位獲取getoption字符

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM