[英]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)
}
如果可以假設:
char* descriptor
指向足夠長的緩沖區: 然后,您可以執行以下一行:
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.