2017-01-09 5 views
1

Wer weiß, wie man in Strings kopieren? Weil ich die Funktion strcpy benutzt habe, aber wenn ich das Ergebnis drucke, zeigt es seltsame Zeichen. Ich möchte 'Name' + '@' + 'E-Mail' verketten. Mit scanf muss ich das Zeichen null '\ 0' setzen?Vector Char seltsame Zeichen

#include <stdio.h> 
#include <string.h> 
int main(){ 

    char message[150]; 
    char name[150]; 
    char mail[150]; 
    char result[150]; 
    printf("Introduce name: \n"); 
    scanf("%s",message); 
    printf("Introduce email \n"); 
    scanf("%s",server); 
    strcpy(result,message); 
    result[strlen(result)]='@'; 
    strcpy(&result[strlen(result)],server); 
    printf("RESULT: %s\n",result); 
    return 0; 
} 
+3

'result [strlen (result)] = '@';' löscht den 0-Terminator der Zeichenkette. Hast du 'strcat' probiert? – mch

+1

Es hängt auch davon ab, was "Server" ist und ob Sie den Puffer "Ergebnis" überlaufen. –

+4

'snprintf (Ergebnis, Größe des Ergebnisses,"% s @% s ", Nachricht, Server);', auch 'char Mail [150];' -> 'char Server [150];' – BLUEPIXY

Antwort

4

result[strlen(result)]='@'; überschreibt die NUL Terminator in result von strcpy(result,message); eingeführt. Das Ergebnis einer nachfolgenden strlen ist also undefiniert.

Eine bessere Lösung ist strncat zu verwenden, oder Sie können mit dem Schreiben

char result[150] = {'\0'};

, die das gesamte Array initialisieren wegzukommen.

Aber Sie laufen immer noch das Risiko von überlaufen Ihre result Array. Sie könnten das sicherer strncpy verwenden, um das zu vermeiden. Besser noch, verwenden Sie snprintf und lassen Sie die C-Standardbibliothek die Verkettung für Sie durchführen.

+0

Ja, definitiv verwenden ' snprintf (Ergebnis, Größe des Ergebnisses, "% s @% s", Nachricht, Server); '. Berücksichtigen Sie auch bessere Namen für die Variablen, sie stimmen nicht sehr gut mit den Eingabeaufforderungen überein. – unwind