2013-03-11 38 views
17

Tôi không biết C++.Chuyển đổi đối số dòng lệnh thành chuỗi

Tôi có một chương trình đọc đường dẫn tệp được mã hóa cứng và tôi muốn làm cho nó đọc đường dẫn tệp từ dòng lệnh thay thế. Vì mục đích đó tôi đã thay đổi mã như thế này:

#include <iostream> 

int main(char *argv[]) 
{ 
... 
} 

nhưng, argv[1] biến tiếp xúc với cách này có vẻ là kiểu con trỏ, và tôi cần nó như một chuỗi. Tôi nên làm gì để chuyển đổi đối số dòng lệnh này thành chuỗi?

+3

Định dạng chuẩn cho 'main' là' int main (int argc, char * argv []) '. Những gì bạn có sẽ biên dịch, nhưng nó sẽ dẫn đến hành vi không xác định. –

+0

Tôi không cần đếm arg, chỉ là chuỗi đại diện cho đối số đầu tiên. – theta

+1

hmm .. 'std :: string s (argv [1]);' là những gì bạn muốn làm? – Naveen

Trả lời

17

Nó đã là một mảng các chuỗi C-style:

#include <iostream> 
#include <string> 
#include <vector> 


int main(int argc, char *argv[]) // Don't forget first integral argument 'argc' 
{ 
    std::string current_exec_name = argv[0]; // Name of the current exec program 
    std::string first_arge; 
    std::vector<std::string> all_args; 

    if (argc > 1) { 

    first_arge = argv[1]; 

    all_args.assign(argv + 1, argv + argc); 
    } 
} 

Đối số argc là đếm các đối số cộng với các tập tin exec hiện hành.

16

Bạn có thể tạo một std::string

#include <string> 
#include <vector> 
int main(int argc, char *argv[]) 
{ 
    // check if there is more than one argument and use the second one 
    // (the first argument is the executable) 
    if (argc > 1) 
    { 
    std::string arg1(argv[1]); 
    // do stuff with arg1 
    } 

    // Or, copy all arguments into a container of strings 
    std::vector<std::string> allArgs(argv, argv + argc); 
} 
0

Thật đơn giản. Chỉ cần làm điều này:

#include <iostream> 
#include <vector> 
#include <string.h> 

int main(int argc, char *argv[]) 
{ 
    std::vector<std::string> argList; 
    for(int i=0;i<argc;i++) 
     argList.push_back(argv[i]); 
    //now you can access argList[n] 
} 

@Benjamin Lindley Bạn nói đúng. Đây không phải là một giải pháp tốt. Vui lòng đọc câu trả lời của juanchopanza.

+3

Bỏ qua vòng lặp và chỉ sử dụng hàm tạo vector. 'std :: vector argList (argv, argv + argc);' –

+1

Đó là rất nhiều chi phí để trích xuất một chuỗi. –

0
#include <iostream> 

std::string commandLineStr= ""; 
for (int i=1;i<argc;i++) commandLineStr.append(std::string(argv[i]).append(" ")); 
+1

Điều này sẽ tạo ra các đối tượng chuỗi tạm thời mà không có lý do gì cả. 'commandLineStr.append (argv [i]). append (" ")' sẽ hiệu quả hơn nhiều ('append' trả về' * this' để cho phép chuỗi này). Ngoài ra, hàm tạo mặc định sẽ làm cho chuỗi trống, vì vậy việc khởi tạo cũng lãng phí. –

Các vấn đề liên quan