ein

2016-07-09 8 views
0

in verschiedenen String Merge habe ich diesen Code:ein

int main(){ 

    char buf[40]; 
    char buff[40]; 
    char bufff[40]; 

    fgets(buf, 40, stdin); 
    fgets(buff, 40, stdin); 
    fgets(bufff, 40, stdin); 
} 

Eingang:

Hello 
from 
Earth 
Hello from Earth 

ich den Code auf eine währungspolitische Plattform senden:

Hello 
from 
Earth 

ich diese Ausgabe haben muss , und es kam zu mir, dass mit dem folgenden Code bekomme ich falsch ausgegeben:

buf[strlen(buf)-1] = ""; 
buff[strlen(buff)-1] = ""; 
bufff[strlen(bufff)-1] = "";  

printf("%s\n%s\n%s\n", buf, buff, bufff); 
printf("%s %s %s", buf, buff, bufff); 
+0

@ user3121023 Das ist richtig, legt es als Antwort – user4789408

+0

die 'fgets()' Funktion immer NUL die Zeichenfolge beendet, so dass keine Notwendigkeit, dass der Schritt separat durchzuführen. Und 'strlen()' wird nicht funktionieren, wenn die Zeichenfolge nicht bereits NULL beendet ist. Das 'fgets()' wird jedoch auch den abschließenden Zeilenumbruch enthalten, den Sie eliminieren wollen, vielleicht mit etwas wie: 'char * newline; if (strchar (buf, '\ n')) {* newline = '\ 0'; } 'Hinweis: gehen Sie nicht davon aus, dass es einen Zeilenumbruch gibt, überprüfen Sie immer zuerst. – user3629249

+0

in den Zuweisungsanweisungen, wie diesem: 'buff [strlen (buff) -1] =" ";' Das '" "' wird in einen Zeiger auf eine Zeichenfolge aufgelöst. Das Zuordnen eines Zeigers zu einem String zu einem Zeichen funktioniert nicht. Verwenden Sie stattdessen diese Art von Zeile: 'buff [strlen (buff) -1] = '\ 0';' – user3629249

Antwort

2
  • "" ist ein Stringliteral, der ein Array ist, und es wird in der Implementierung definierte Weise Ganzzahl umgewandelt werden. Sie sollten '\0' als NUL-Zeichen verwenden.
  • Die letzten Zeichen von Zeilen müssen keine Newline-Zeichen sein.
  • Sie müssen die Leerzeichen in der Eingabe entfernen, damit sie mit der Ausgabe übereinstimmen.

Try this:

#include <stdio.h> 
#include <string.h> 

int main(void){ 

    /* initialize to avoid undefined behavior when no data is read */ 
    char buf[40] = ""; 
    char buff[40] = ""; 
    char bufff[40] = ""; 
    char *lf; 

    /* read the input */ 
    fgets(buf, 40, stdin); 
    fgets(buff, 40, stdin); 
    fgets(bufff, 40, stdin); 

    /* remove newline characters if they exists */ 
    if ((lf = strchr(buf, '\n')) != NULL) *lf = '\0'; 
    if ((lf = strchr(buff, '\n')) != NULL) *lf = '\0'; 
    if ((lf = strchr(bufff, '\n')) != NULL) *lf = '\0'; 

    /* remove space characters: implement here to match the actual specification */ 
    if ((lf = strchr(buf, ' ')) != NULL) *lf = '\0'; 
    if ((lf = strchr(buff, ' ')) != NULL) *lf = '\0'; 
    if ((lf = strchr(bufff, ' ')) != NULL) *lf = '\0'; 

    /* print */ 
    printf("%s\n%s\n%s\n", buf, buff, bufff); 
    printf("%s %s %s", buf, buff, bufff); 

    return 0; 
} 

in diesem Code Ausgelassene, sollten Sie überprüfen, ob Lesungen erfolgreich sind.

0

Ich habe diese einfache Funktion zum Entfernen von rechts nach hinten gerichteten Leerzeichen im Allgemeinen erstellt. Sollte auch zusätzliche Leerzeichen entfernen. Und Sie können es sogar leicht anpassen, um andere Symbole herauszufiltern, die Sie wollen.

#define IS_WHITESPACE(Char) (Char == ' ' || Char == '\n' || Char == '\t') 

void trim_right(char *string) 
{ 
    int i; 

    for (i = strlen(string) - 1; i >= 0; i++) 
     if (IS_WHITESPACE(string[i])) 
      string[i] = '\0'; 
     else 
      break; 
} 
+0

Auslassen der Klammern macht den Code viel schwieriger zu verstehen, zu debuggen, zu warten. Und jede Bearbeitung ist fast sicher, dass der Code nicht richtig funktioniert. Empfehlen Sie dringend, die 'for'' if '' else' Codeblöcke immer mit geschweiften Klammern zu versehen. – user3629249