簡體   English   中英

在現實生活中管理字符*

[英]Managing char * in real life

我有用參數char* descriptor調用的函數。 在函數中,我需要檢查描述符不等於空字符串"" 如果是這樣,請給descriptor名稱"new_name" 但是名稱不應該是常數,因為它將在函數encode更改。 這是我如何實現的代碼:

f1(char* descriptor)
{
    if (strcmp(descriptor, "") == 0) 
        {
        char d[9] ="new_name";
        descriptor = d;
        }
...
encode(descriptor)
}

void encode(char* descriptor)
{
...
}

此代碼正確嗎? 對於我來說,代碼看起來很笨拙。 是否有可能以更優雅的方式編寫此類任務並將其簡化?

f1(std::string& descriptor)
{
    if (descriptor.empty()) 
    {
        encode(descriptor)
    }
}

void encode(std::string& descriptor)
{
    // Change string here.
}

考慮到我使用std::string因為您使用c++而不是c標記了該帖子,在這種情況下,我看不出有任何理由使用char*代替std::string

編輯

我的代碼僅在為空時才編碼字符串。 如果仍然要更改字符串,則必須修改代碼:

f1(std::string& descriptor)
{
    if (descriptor.empty()) 
    {
        descriptor = "new_name";
    }
    encode(descriptor);
}

void encode(std::string& descriptor)
{
    // Change string here.
}
f1(char* descriptor)
{
    if (strcmp(descriptor, "") == 0) 
    {
        strcpy(descriptor, "new_name");
    }
...
encode(descriptor)
}

如果可以假設:

  1. char* descriptor指向足夠長的緩沖區:
  2. 覆蓋描述符的緩沖區是完全可以的。

然后,您可以執行以下一行:

encode(*descriptor:descriptor?strcpy(descriptor,"new_name"));

三元運算符的計算結果為descriptor ,如果*descriptor不為空,而結果strcpy(descriptor,'new_name')否則,和strcpy返回目標字符串,這是descriptor ,以“NEW_NAME”新覆蓋。

如果您使用的是C ++,則應使用std::string或某些變體。 我假設您正在使用C,因為您的代碼是純C。

if (strcmp(descriptor, "") == 0) 
{
    char d[9] ="new_name";
    descriptor = d;
}

這是錯誤的(並且,相信我,這很不好),因為d越是超出范圍就越超出范圍,即if塊結束就越早。 因此,在那里,您有未定義的行為。 但是,如果您在函數的頂層定義了d ,那就可以了。

f1(char* descriptor)
{
    char d[9] ="new_name";
    if (strcmp(descriptor, "") == 0) 
    {
        descriptor = d;
    }
    ...
    encode(descriptor)
}

現在您可以了,因為一旦超出范圍就不再引用d :因為它的范圍是整個函數(而不僅僅是if塊),所以當您調用encore(descriptor) ,它仍然存在。

暫無
暫無

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

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