我覺得這是一個非常愚蠢的問題,但我似乎無法在任何地方找到答案!獲取char數組的一部分
是否有可能從字符數組中獲取一組字符?扔了一些僞代碼:
char arry[20] = "hello world!";
char part[10] = arry[0-4];
printf(part);
輸出:
hello
所以,我可以得到一個這樣的數組字符的部分不循環,讓他們炭通過炭或轉換到字符串,所以我可以使用substr()?
我覺得這是一個非常愚蠢的問題,但我似乎無法在任何地方找到答案!獲取char數組的一部分
是否有可能從字符數組中獲取一組字符?扔了一些僞代碼:
char arry[20] = "hello world!";
char part[10] = arry[0-4];
printf(part);
輸出:
hello
所以,我可以得到一個這樣的數組字符的部分不循環,讓他們炭通過炭或轉換到字符串,所以我可以使用substr()?
總之,沒有。 C風格的「字符串」根本就不是那種方式。您將不得不使用手動循環或strncpy()
,或通過C++ std::string
功能執行此操作。考慮到你使用的是C++,你可以使用C++字符串做所有事情!
側面說明
碰巧,爲您的特定示例應用程序,您可以通過由printf()
提供的功能簡單地實現這一點:
printf("%.5s\n", arry);
你可以使用memcpy
(或strncpy
)得到一個子串:
memcpy(part, arry + 5 /* Offset */, 3 /* Length */);
part[3] = 0; /* Add terminator */
在另一個請注意,如果str
包含不可信輸入,則執行printf(str)
會導致格式化字符串漏洞。
針對`printf`漏洞的+1。 – 2011-01-23 23:18:58
正如Oli所說,您需要使用C++ std::string
功能。在你的例子中:
std::string hello("Hello World!");
std::string part(hello.substr(0, 5)); // note it's <start>, <length>, so not '0-4'
std::cout << part;
那麼,你提到了兩種明顯的方法。我唯一能想到的就是定義你自己的子字符串類型來處理字符數組:
struct SubArray
{
SubArray(const char* a, unsigned s, unsigned e)
:arrayOwnedElseWhere_(a),
start_(s),
end_(e)
{}
const char* arrayOwnedElseWhere_;
unsigned start_;
unsigned end_;
void print()
{
printf_s("%.*s\n", end_ - start_ + 1, arrayOwnedElseWhere_ + start_);
}
};
好的,那太糟糕了。哦,我可以轉換成字符串,我只是想知道是否有更多...優雅的解決方案。 我正在修改char數組的一部分以便稍後使用,所以只是使用printf的功能將無法解決它。但是,無論如何,感謝那個珍聞,我不知道這一點,它可能會派上用場! – Curlystraw 2011-01-23 23:24:06
@Curlystraw:@ Moo-Juice的答案在下面使用C++字符串,如果你問我,那麼它就非常優雅! – 2011-01-23 23:25:59