2015-12-04 5 views
6

Ich versuche, die ersten 8 Zeichen einer Zeichenfolge in C abzurufen, und was ich gerade mache, kann die ersten 8 Zeichen drucken, aber wenn die Zeichenfolge kleiner als 8 ist Zeichen lang, es hat immer noch eine Länge von 8 Zeichen, was nicht das ist, was ich will.Auswählen nur der ersten paar Zeichen in einer Zeichenfolge C++

string message = "  "; 

    const char * word = holder.c_str(); 

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

Wenn Halter "123456789abc" nach diesem Code enthalten wäre es enthält "12345678" Wenn der Inhaber jedoch "1234" enthält, enthält diese Nachricht "1234____", wenn die Unterstriche leer sind.

Ich bin sicher, es gibt einen einfacheren Weg, dies zu tun, danke für die Hilfe im Voraus. Außerdem bin ich mir ziemlich sicher, dass das Erstellen einer leeren Folge von 8 Zeichen eine ziemlich schreckliche Sache ist.

+0

Wenn Sie sagen, löschen Sie den Rest der Zeichen aus der Zeichenfolge, meinen Sie die ursprüngliche Zeichenfolge? Was ist der Sinn der Räume? –

+0

Ich habe versucht, die Frage für die Klarheit zu bearbeiten, es war mehrdeutig. Die Leerzeichen waren, weil, wenn ich nur string message = "" benutzte, ein Fehler außerhalb des Bereichs erhalten wurde, als ich durch die Schleife lief.Ich benutze jetzt substr und es funktioniert. Vielen Dank! – chrisz

Antwort

8

Nur std::string::substr verwenden:

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

Seine Frage ist zweideutig und es gibt keine Möglichkeit zu sagen, welche unserer Antworten richtig ist. Es hängt davon ab, was das OP mit "the string" in "lösche den Rest der Zeichen aus der Zeichenkette" meint. –

+0

Wenn die erste Zeichenkette weniger als 8 Zeichen enthält, ändert das Subtring etwas an der Zeichenkette? Aber danke für die schnelle Antwort, es hat perfekt funktioniert. – chrisz

+0

@qlear sollten Sie die Dokumentation lesen - 'substr()' ist eine konstante Methode, dh ändert sich das Objekt selbst unter keiner Bedingung. – Slava

6

Rufen Sie einfach resize auf der Saite.

3

Wenn ich das richtig verstanden habe man dann schreiben Sie einfach

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

Jf Sie Zeichen aus einem Zeichenfeld müssen greifen, dann können Sie zum Beispiel schreiben

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] = ' '; 
    } 
} 

Dies ist ein schaffen Zeichen-Array der richtigen Größe und übertragen Sie über jedes numerische Zeichen (0-9) und ersetzen Sie Nicht-Numerik durch Leerzeichen. Das klingt nach dem, wonach du suchst.

Gegeben, was andere Leute basierend auf Ihrer Frage interpretiert haben, können Sie den obigen Ansatz leicht ändern, um Ihnen eine resultierende Zeichenfolge zu geben, die nur den numerischen Teil enthält.

Etwas wie:

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

Dann numericLength in der vorherige Logik anstelle von length verwenden und Sie werden die erste Reihe von numerischen Zeichen erhalten.

Hoffe, das hilft!

0

Oder Sie könnten so:

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

Wenn der max 8 wird es dort stoppen. Aber Sie müssten gesetzt

const char * word = holder.c_str(); 

bis 8. Ich glaube, dass Sie tun können, dass durch das Schreiben

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

Lassen Sie mich wissen, ob das funktioniert.

Wenn sie den Raum an irgendeinem Punkt treffen, würde es nur bis zum Raum lesen.