2016-05-08 14 views
2

Dies ist wahrscheinlich eine sehr neue Frage, aber kann ich das beheben, so dass alle Zeichen (außer \ r) zu meiner neuen Zeichenfolge hinzugefügt werden? Gerade jetzt fügen Sie nur Zeichen bis zum \ r hinzu. Ich möchte auch Charaktere nach \ r hinzufügen.Alle Zeichen außer r zu neuer Zeichenfolge hinzufügen

void to_unix_line_endings(char* contents, char* ucontents) { 
    int i; 
    for (i = 0; i < strlen(contents); i++) { 
    if(contents[i] != '\r') { 
     ucontents[i] = contents[i]; 
    } 
    } 
} 

char out[5000]; 
to_unix_line_endings("spaghettiand\rmeatballs", out); 
printf("%s\n", out); 
// Prints "spaghettiand". I want "spaghettiandmeatballs". 

Danke.

+2

'ucontents [i]': andere Indexvariable anstelle von 'I'. und Null-Terminator zum Ende hinzufügen. – BLUEPIXY

+0

Danke. Ich habe hinzugefügt, wie ich es unten befestigte, Ihrem Rat folgend. Habe ich den Nullabschluss korrekt hinzugefügt? –

Antwort

2

In den Kommentaren (unter Ihrer Antwort), das zeigt @BLUEPIXY, weil j nie length gleich sein wird, ucontents wird NULL nie im if(j == length) Block beendet werden.

Also, obwohl Ihr Code Beispiel (in der Antwort Abschnitt) schien für Sie arbeiten, wie es ist, wird der Code schließlich fehlschlagen. printf() benötigt einen Null-Terminator, um das Ende der Zeichenfolge zu identifizieren. Wenn der Speicher, an den Sie schreiben, keinen NULL-Terminator an der richtigen Stelle hat, wird er fehlschlagen. (wie jede der String-Funktionen).

Die folgende Änderung Ihrer Puffer beenden null wird:

void to_unix_line_endings(char* contents, char* ucontents) { 
    int i; 
    int j = 0; 
    int length = strlen(contents);//BTW, good improvement over original post 
    for (i = 0; i < length; i++) { 
    if(contents[i] != '\r') { 
     ucontents[j] = contents[i]; 
     /*if (j == length) { //remove this section altogether 
     ucontents[j] = '\0'; 
     break; 
     }*/ 
     j++;//this increment ensures j is positioned 
      //correctly for NULL termination when loop exits 
    } 
    } 
    ucontents[j]=NULL;//add NULL at end of loop 
} 
+1

Danke. Ich habe meinen Code geändert, um den redundanten Block zu entfernen. –

1

Fest so. Danke, BLUEPIXY.

void to_unix_line_endings(char* contents, char* ucontents) { 
    int i; 
    int j = 0; 
    int length = strlen(contents); 
    for (i = 0; i < length; i++) { 
    if(contents[i] != '\r') { 
     ucontents[j] = contents[i]; 
     if (j == length) { 
     ucontents[j] = '\0'; 
     break; 
     } 
     j++; 
    } 
    } 
} 
+2

'j' wurde niemals' Länge'. [Beispiel] (http://ideone.com/lzNZQS) – BLUEPIXY

+0

Danke. Das war besser als das, was ich getan habe. Ich portiere ein Programm von C++ nach C. –

+1

@ SamSaint-Pettersen - Ihr 'if (j == Länge)' Block wird nie ausgeführt. (das ist, was BLUEPIXY's Kommentar sagt) – ryyker