2011-01-23 68 views
8

我覺得這是一個非常愚蠢的問題,但我似乎無法在任何地方找到答案!獲取char數組的一部分

是否有可能從字符數組中獲取一組字符?扔了一些僞代碼:

char arry[20] = "hello world!"; 
char part[10] = arry[0-4]; 
printf(part); 

輸出:

hello 

所以,我可以得到一個這樣的數組字符的部分不循環,讓他們炭通過炭或轉換到字符串,所以我可以使用substr()?

回答

15

總之,沒有。 C風格的「字符串」根本就不是那種方式。您將不得不使用手動循環或strncpy(),或通過C++ std::string功能執行此操作。考慮到你使用的是C++,你可以使用C++字符串做所有事情!

側面說明

碰巧,爲您的特定示例應用程序,您可以通過由printf()提供的功能簡單地實現這一點:

printf("%.5s\n", arry); 
+0

好的,那太糟糕了。哦,我可以轉換成字符串,我只是想知道是否有更多...優雅的解決方案。 我正在修改char數組的一部分以便稍後使用,所以只是使用printf的功能將無法解決它。但是,無論如何,感謝那個珍聞,我不知道這一點,它可能會派上用場! – Curlystraw 2011-01-23 23:24:06

+0

@Curlystraw:@ Moo-Juice的答案在下面使用C++字符串,如果你問我,那麼它就非常優雅! – 2011-01-23 23:25:59

14

你可以使用memcpy(或strncpy)得到一個子串:

memcpy(part, arry + 5 /* Offset */, 3 /* Length */); 
part[3] = 0; /* Add terminator */ 

在另一個請注意,如果str包含不可信輸入,則執行printf(str)會導致格式化字符串漏洞。

+0

針對`printf`漏洞的+1。 – 2011-01-23 23:18:58

4

正如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; 
0

那麼,你提到了兩種明顯的方法。我唯一能想到的就是定義你自己的子字符串類型來處理字符數組:

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_); 
    } 
};