2016-05-04 4 views
0

Ich versuche, eine kleine Funktion zum Drucken von Char-Array, die in der Mitte und Ende enthält zu schreiben. Meine Funktion druckt das Gerät nicht richtig, was ich :-(
Erwartetes Ergebnis fehlt: Good-bye0ld0 Aktuell: Good-bye ldFunktion zum Drucken char [] Array in C++

// call function 
char str5[] = { 'G','o','o','d','-','b','y','e',0,'l','d',0 }; 
    displayResult(str5); 

// This is function 

    void displayResult(string _st) 
    { 
     int l = _st.length(); 
     for (int i = 0; i<=l; i++) 
    { 
     cout << _st[i]; 
     //printf("%s\n", _st[i]); 
    } 
    cout << endl; 
    } 
+0

0 ist ein eos Marker. Verwende '0'. –

+0

Ich möchte mein Array nicht ändern. Ich möchte meine Funktion zum Drucken ändern. @JohnnyMopp – Jeff

+0

'cout << (_st [i]? _st [i]: '0');' –

Antwort

2

setzen die 0 als ein Zeichen '0' . seit '0' und 0 sind nicht gleich.Wenn Sie einfach setzen 0, geben Sie den ASCII-Code des Zeichens, das ein Null-Terminator-Zeichen (Marker für Ende der Zeichenfolge) ist, und Sie werden nichts dort zu sehen. t vergessen, den Nullabschluss am Ende zu setzen.

char str5[] = { 'G','o','o','d','-','b','y','e','0','l','d','0','\0' }; 
+0

Ich möchte mein Array nicht ändern. Ich möchte meine Funktion zum Drucken ändern. @bkVnet – Jeff

+0

@Keihan in diesem Fall, für '\ 0' überprüfen und '0' ausgeben. –

+0

@bkVnet: Ihre Lösung funktioniert möglicherweise nicht, da '\ 0' der String-Terminator ist. Woher weiß man, ob es in der Zeichenkette 0, 1 oder viele gibt? Hmmm .... –

1

Sie Funktion wie diese

void displayResult(string _st) 
{ 
    int l = _st.length(); 
    for (int i = 0; i < l; i++) 
    { 
     cout << ((_st[i]== 0) ? '0' : _st[i]); 
     //printf("%s\n", _st[i]); 
    } 
} 
+0

Wo ist das Zeichenfeld? Das OP verwendet Zeichenarrays. –

+0

Verwenden Sie außerdem keine führenden Unterstriche in Variablennamen, da sie mit internen Compilersymbolen in Konflikt stehen können. –

2

Eine Möglichkeit, schreiben könnte, ist zu prüfen, ob bestimmte Zeichen ‚\ 0‘ ist und gibt es als 0:

if (_st[i] == '\0') 
     cout << '0'; 
    else 
     cout << _st[i]; 

auch ganze Array übergeben zu Ihrem Funktion sollten Sie einen anderen Zeichenkettenkonstruktor verwenden, der Iteratoren akzeptiert:

displayResult(std::string(std::begin(str5), std::end(str5))); 

otherwis e std :: string wird Array-Inhalt nur bis zum ersten Nullzeichen

Letzte, was kopieren, wenn Sie in der Ausgabe letzte Nullzeichen nicht einschließen möchten dann Schleifenbedingung ändern:

for (int i = 0; i<l; i++) 
       ^^^ 
+0

Es gibt auch ein Problem im Loop-Zustand, es sollte weniger als nicht weniger oder gleich sein – Slava

+0

@Slava thanx, ich habe mir das nur angeschaut – marcinj

1

Sie viele haben Probleme.

char str5[] = { 'G','o','o','d','-','b','y','e',0,'l','d',0 }; 
    displayResult(str5); 

Es gibt eine implizite Konvertierung aus dem Zeichenfeld in den std::string Typ.

Der Konstruktor des std::string Typs Last Zeichen aus dem Array, bis es einen Abschluss NUL-Zeichen erreicht, die nach dem „bye“ ist. Daher wird "ld" niemals in die Zeichenfolge eingefügt.

Wenn Sie alle Zeichenwerte wollen in die Zeichenfolge platziert werden können, müssen Sie explizit die richtige std::string constructor nennen:

char str5[] = { 'G','o','o','d','-','b','y','e',0,'l','d',0 }; 
std::string s(str5, sizeof(str5)); 
displayResult(s); 

Die std::string ist für alle Werte eines Zeichensatzes aufzunehmen, einschließlich Abschluss Nul und nicht druckbar.

Wenn Sie den richtigen Konstruktor verwenden, ist das fehlerhafte '\ 0' in der Zeichenfolge vorhanden, und Sie können es suchen und ersetzen (innerhalb der Zeichenfolgenvariablen).

Sie können das Zeichen-Array als const zu erklären, wenn es keine Pläne, ihn zu ändern:

const char str5[] = { 'G','o','o','d','-','b','y','e',0,'l','d',0 }; 

Sie können dies auch als erklären:

const char str6[] = {"Good-bye\0ld"};