2015-12-04 30 views
6

Próbuję pobrać 8 pierwszych znaków ciągu znaków w C, a to, co teraz robię, może wydrukować pierwszych 8 znaków, ale jeśli ciąg znaków jest mniejszy niż 8 znaków długości, wciąż ma długość 8 znaków, co nie jest tym, czego chcę.Wybieranie tylko pierwszych kilku znaków w ciągu znaków C++

string message = "  "; 

    const char * word = holder.c_str(); 

    for(int i = 0;i<message.length();i++) 
     message[i] = word[i]; 

Jeżeli posiadacz zawiera "123456789abc" po tym kodzie byłoby zawierać "12345678." Jeśli jednak posiadacz zawiera "1234", po tym komunikacie będzie zawierać "1234____", gdzie podkreślenia są puste.

Jestem pewien, że jest prostszy sposób, aby to zrobić, dzięki za pomoc z góry. Jestem też całkiem pewien, że utworzenie pustego ciągu 8 znaków jest dość przerażające.

+0

Kiedy mówisz "usuń pozostałe znaki z ciągu znaków", masz na myśli oryginalny ciąg znaków? A jaki jest sens przestrzeni? –

+0

Próbowałem edytować pytanie dla jasności, było niejednoznaczne. Spacje były spowodowane tym, że jeśli użyłem tylko komunikatu typu string = "", wystąpił błąd poza zasięgiem, gdy przebiegłem przez pętlę.Używam substr teraz i działa. Dzięki! – chrisz

Odpowiedz

8

Wystarczy użyć std::string::substr:

std::string str = "123456789abc"; 
std::string first_eight = str.substr(0, 8); 
+2

Jego pytanie jest niejednoznaczne i nie ma sposobu, aby powiedzieć, która z naszych odpowiedzi jest właściwa. Zależy to od tego, co OP oznacza "ciąg" w "usuń pozostałe znaki z ciągu". –

+0

Jeśli pierwszy ciąg znaków ma mniej niż 8 znaków, czy zrobienie na nim łańcucha zmieni coś w ciągu znaków? Ale dzięki za szybką odpowiedź, zadziałało idealnie. – chrisz

+0

@ qear powinieneś przeczytać dokumentację - 'substr()' jest metodą const, tzn. Nie zmienia samego obiektu pod jakimkolwiek warunkiem. – Slava

3

Jeśli dobrze zrozumiałem wtedy wystarczy napisać

std::string message = holder.substr(0, 8); 

Jf trzeba chwycić znaki z tablicy znaków następnie można napisać na przykład

const char *s = "Some string"; 

std::string message(s, std::min<size_t>(8, std::strlen(s)); 
-1
char* messageBefore = "12345678asdfg" 
int length = strlen(messageBefore); 
char* messageAfter = new char[length]; 

for(int index = 0; index < length; index++) 
{ 
    char beforeLetter = messageBefore[index]; 
    // 48 is the char code for 0 and 
    if(beforeLetter >= 48 && beforeLetter <= 57) 
    { 
     messageAfter[index] = beforeLetter; 
    } 
    else 
    { 
     messageAfter[index] = ' '; 
    } 
} 

To stworzy tablica znaków o odpowiednim rozmiarze i przeniesienie na każdy znak liczbowy (0-9) i zastąp nie-numeryczne spacjami. To brzmi jak to, czego szukasz.

Biorąc pod uwagę to, co inni ludzie zinterpretowali na podstawie Twojego pytania, możesz łatwo zmodyfikować powyższe podejście, aby uzyskać wynikowy ciąg zawierający tylko część liczbową.

Coś jak:

int length = strlen(messageBefore); 
int numericLength = 0; 
while(numericLength < length && 
     messageBefore[numericLength] >= 48 && 
     messageBefore[numericLength] <= 57) 
{ 
    numericLength++; 
} 

Następnie użyj numericLength w poprzednim logiki zamiast length a dostaniesz pierwsze kilka znaków numerycznych.

Mam nadzieję, że to pomoże!

0

Albo można użyć to:

#include <climits> 
cin.ignore(numeric_limits<streamsize>::max(), '\n'); 

Jeśli max 8 to będzie tam zatrzymać. Ale trzeba by ustawić

const char * word = holder.c_str(); 

do 8. Uważam, że można to zrobić pisząc

const int SIZE = 9; 
char * word = holder.c_str(); 

Daj mi znać, czy to działa.

Jeśli w dowolnym momencie uderzy w przestrzeń, będzie tylko czytać w przestrzeni.