簡體   English   中英

在argv主參數中傳遞const char

[英]passing const char in argv main argument

我有以下內容:

int main(int argc, char *argv[])
{    
    char *INPUTFILE_DATABASE = "";
    strcpy(INPUTFILE_DATABASE, argv[1]);    
    if(INPUTFILE_DATABASE[0]=='\0')
    {
        cout << "No input file given" << endl;
        INPUTFILE_DATABASE="File_name.csv";
    }
    cout << "Input file: " << INPUTFILE_DATABASE << endl;

    return 0;

編譯時,我收到:

warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
  char *INPUTFILE_DATABASE = "";

當我將char *INPUTFILE_DATABASE設為const char *INPUTFILE_DATABASE我不能再更改它了,當然不能更改。 我究竟做錯了什么? 還是我的動力通常無法以這種方式實現?

最后,我只想允許更改輸入文件名,但是當沒有給出文件名時,應使用標准文件名。

您永遠都無法更改它。 就是這樣,由於使用了舊的C規則,因此您看起來可以。 規則的更改(在C ++ 98中已棄用;實際上,由於C ++ 11而已,這是非法的,不會編譯)是為了更好地提醒您這一點。

要更改字符串,請將其復制到您擁有的東西上,最好使用std::string ,尤其是由於您對C字符串的掌握似乎並不十分強大(您嘗試復制的長度為零的字符串)可能是非零長度的字符串!)。

實際上,我不會復制任何內容,但是會重新安排您的邏輯以有條件地初始化INPUTFILE_DATABASE ,而該內容仍然是原始的常量字符串,如下所示:

// Use argv[1] if given and non-empty, otherwise a default path
const char* INPUTFILE_DATABASE = (
   argc > 1 && argv[1][0] != '\0'
   ? argv[1]
   : "File_name.csv"
);

是的,您不應該這樣做。 代替這個:

char *INPUTFILE_DATABASE = "";

你應該做一些諸如

char INPUTFILE_DATABASE[32]; // or another size that is sufficent

當您執行char *INPUTFILE_DATABASE = "";時會發生什么? 是您的char*將指向僅保留"" (因此可能只是程序二進制文件中某個位置的值為0的字節)。 你不能寫信到那里。

另外,由於這是C ++,所以我建議:

std::string INPUTFILE_DATABASE = argv[1];

而不是if(INPUTFILE_DATABASE[0]=='\\0')您可以執行if (!INPUTFILE_DATABASE.size())

您可以使用std::string為您管理內部char緩沖區。 舉個例子,

#include <string>

std::string INPUTFILE_DATABASE;

if (argc == 1)
   INPUTFILE_DATABASE = "File_name.csv";
else
   INPUTFILE_DATABASE = argv[1];

那就不應該那么復雜了:

char const* INPUTFILE_DATABASE = argc > 1 ? argv[1] : "File_name.csv";

您不應以任何一種方式修改此字符串,將其設置為char const *可以防止產生錯誤。

首先:不要這樣做,只需使用std::string 如果可以幫助您減少C樣式字符串出現的愚蠢錯誤的數量,

回到您的問題:

auto i = std::make_unique<char[]>(512); // or more? (Could be calculated at runtime)
std::strcpy(i.get(), argv[1]);
if (i[0]=='\0')
    {
        cout << "No input file given" << endl;
        std::strcpy(i.get(), "filename.csv");
    }
cout << "Input file: " << i.get() << std::endl;

當然,直接與char *一起工作需要您知道字符數。 如前所述, std:: string使事情變得更容易:

auto i = std::string(argc[1]);
if (i.empty())
    {
        cout << "No input file given" << endl;
        i = "filename.csv";
    }
cout << "Input file: " << i << std::endl;

對於這種特定情況, std::string_view也應該起作用。

請注意,《 Lightness Races in Orbit中的Lightness Races in Orbit發布了另一種變體,它不需要您僅使用char const *就可以為這種特定情況分配內存。

暫無
暫無

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

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