2013-07-17 3 views
0

В C можно объявить массив символов, создать указатель на определенное место в массиве, и разыменования его, чтобы получить суффикс в указанной позиции:Получение всех суффиксов строки в C++

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

Приведенный выше код будет печатать

LEEP 

который является суффикс «СОН» в положении 1. Теперь есть способ сделать что-то подобное в C++ без использования метода SubStr как он производит совершенно новую строку и я т пытается избежать этого.

+3

Итак, C или C++? Выбери один. –

+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 буфера (как вы должны быть), то при 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, то std::vector обеспечивает ту же гарантию совместимости даже в C++ 03, но, конечно же, вы должны применить один ограничитель 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

Я сделаю 'count <<" SLEEP "+ 1;', я прав? –

+1

Нет. Подождите, что? –

+0

Я добавил один к строковому адресу, см. '' SLEEP '[1] '==' 'L'' или '' SLEEP "[1]' == '* (" SLEEP "+ 1)' so для адреса '' SLEEP "[1]' Я сделал, '" SLEEP "+ 1'. –

0

вы можете использовать метод массива, если хотите. Пример, который я даю, это C++.

например MyStr [0] является указателем на первый элемент.

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

выход: Ьс

Надежда, что помогает :-)

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

Я сделаю 'count <<" SLEEP "+ 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; 
} 

Примечание: есть только один фактический экземпляр строки «СОН». sr1 и sr2 - ссылки на строки str.

Смежные вопросы