2013-07-17 72 views
0

在C一個可以聲明字符數組,創建一個指針陣列中的特定位置,並解除引用它得到在指定位置處的後綴:獲得C++中的字符串的所有後綴

char str[6] = "SLEEP"; 
char* pointer = &(str[1]); 
printf("%s\n", pointer); 

上面的代碼將打印

LEEP 

其是「睡眠」的在位置1現在後綴有辦法做在C++類似的東西,而無需使用SUBSTR方法,因爲它產生一個完全新的字符串和I」米試圖避免這一點。

+3

那麼,C還是C++?選一個。 – 2013-07-17 20:05:22

+1

使用迭代器對。 – chris

+1

std :: string str(「SLEEP」); char * pointer =&(str.c_str()[1]); printf(「%s \ n」,指針); – madnut

回答

8

你可以做的正是你已經做了什麼。

char str[6] = "SLEEP"; 
char* pointer = &(str[1]); 
printf("%s\n", pointer); 

如果使用一個std::string來代替原始char緩衝器(如你應該是),然後在C++ 11 std::string保證具有連續的存儲(21.4.1/5)與附加的NUL終止符(21.4.7.1/1):

std::string str = "SLEEP"; 
const char* pointer = &str[1]; 

這些保證是新的C++ 11 - C++ 03沒有這樣的保證。但是我知道的所有實現實際上都使用帶有附加NUL終結符的連續存儲。他們這樣做是因爲需要c_str()才能將const指針返回給C風格的字符串。如果你想要一個在C++ 03中保證兼容的解決方案,那麼即使在C++ 03中,std::vector也可以提供相同的連續性保證,但當然你必須自己應用NUL終結器:

std::string load = "SLEEP"; 
vector <char> str; 
copy (load.begin(), load.end(), back_inserter (str)); 
load.push_back ('\0'); // Appended NUL terminator 
const char* pointer = &str [1]; 

但是現在我們正在談論製作副本,顯然。

+0

我會'計數'「SLEEP」+ 1;',我正確嗎? –

+1

號等等,什麼? –

+0

我添加了一個字符串地址,參見''SLEEP'[1]'''''''''L''或者''SLEEP'[1]'=='*(「SLEEP」+ 1) ''睡'「[1]'我做了','睡'+ 1'。 –

0

如果需要,您可以使用數組方法。 我給的例子是C++。

例如MyStr [0]是指向第一個元素的指針。

#include <string> 
#include <iostream> 
int main() 
{ 
    std::string MyStr="abc"; 
    std::cout<<&MyStr[1]; 
} 

輸出:BC

希望幫助:-)

3
#include <string> 
#include <iostream> 

int main() 
{ 
    std::string s("SLEEP"); 
    std::cout << &s[1] << std::endl; 
} 

這是保證工作在C++ 11。在C++ 03中,不存在這樣的保證,因爲實現允許使用拷貝寫入(COW)。但是我不記得在沒有工作的情況下使用這個實現。如果使用C++ 03並需要保證,你將可以使用std::string::c_str()

std::cout << &s.c_str()[1] << std::endl; 
+1

肯定在C++ 11中工作:) – chris

+0

在C++ 03中不保證。 –

+0

我會'計數<<「睡眠」+ 1;',我正確嗎? –

0

您可以使用字符串引用類。字符串引用類提供類似字符串的功能,但實際上並不擁有底層存儲。

下面是使用升壓string_ref類(在Boost.Utility找到)

#include <iostream> 
#include <string> 
#include <boost/utility/string_ref.hpp> 

int main(int argc, const char * argv[]) 
{ 
    using namespace std; 

    string str = "SLEEP"; 
    cout << "str: " << str << endl; 
    boost::string_ref sr1(str); 
    cout << "sr1: " << sr1 << endl; 
    boost::string_ref sr2 = sr1.substr(1); 
    cout << "sr2: " << sr2 << endl; 
    return 0; 
} 

注意一個例子:有隻在一個字符串「睡眠」的實際情況。 sr1sr2是對str的字符串引用。

相關問題