2015-12-04 67 views
6

Sto provando ad afferrare i primi 8 caratteri di una stringa in C, e quello che sto facendo adesso può stampare i primi 8 caratteri, ma se la stringa è minore di 8 caratteri lunghi, ha ancora una lunghezza di 8 caratteri, che non è quello che voglio.Selezionare solo i primi caratteri in una stringa C++

string message = "  "; 

    const char * word = holder.c_str(); 

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

Se detentore contiene "123456789abc" dopo questo codice conterrebbe "12345678." Tuttavia, se il titolare contiene "1234", dopo questo messaggio conterrà "1234____" dove i caratteri di sottolineatura sono vuoti.

Sono sicuro che c'è un modo più semplice per farlo, grazie per l'aiuto in anticipo. Inoltre, sono abbastanza sicuro che creare una stringa vuota di 8 caratteri sia una cosa piuttosto terribile da fare.

+0

Quando dici "elimina il resto dei caratteri dalla stringa", intendi la stringa originale? Inoltre, qual è il punto degli spazi? –

+0

Ho provato a modificare la domanda per chiarezza, era ambigua. Gli spazi erano perché se avessi usato solo string message = "" ho ricevuto un errore fuori intervallo quando ho eseguito il ciclo.Sto usando substr ora e sta funzionando. Grazie! – chrisz

risposta

8

Basta usare std::string::substr:

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

La sua domanda è ambigua e non c'è modo di dire quale delle nostre risposte sia giusta. Dipende da cosa l'OP intendeva per "la stringa" in "cancella il resto dei caratteri dalla stringa". –

+0

Se la prima stringa ha meno di 8 caratteri, il substr di stampa cambierà qualcosa sulla stringa? Ma grazie per la risposta rapida, ha funzionato perfettamente. – chrisz

+0

@qlear si dovrebbe leggere la documentazione - 'substr()' è un metodo const cioè non cambia oggetto stesso in nessuna condizione. – Slava

6

basta chiamare resize sulla corda.

3

Se ho capito bene allora basta scrivere

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

Jf avete bisogno di afferrare i caratteri da un array di caratteri allora si può scrivere per esempio

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

Questo creerà un matrice di caratteri della dimensione corretta e trasferire su ogni carattere numerico (0-9) e sostituire non numerici con spazi. Questo suona come quello che stai cercando.

Dato ciò che altre persone hanno interpretato in base alla domanda, è possibile modificare facilmente l'approccio precedente per fornire una stringa risultante che contiene solo la parte numerica.

Qualcosa di simile:

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

Quindi utilizzare numericLength nella logica precedente al posto di length e si otterrà il primo gruppo di caratteri numerici.

Spero che questo aiuti!

0

Oppure si potrebbe usare questo:

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

Se il massimo è di 8 si fermerà lì. Ma si dovrebbe impostare

const char * word = holder.c_str(); 

a 8. Credo che si potrebbe fare scrivendo

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

fammi sapere se questo funziona.

Se colpiscono lo spazio in qualsiasi punto, leggerebbero solo nello spazio.

Problemi correlati