2017-07-20 3 views
-1

Hi Ich versuche, String in Position N mit C einzufügen. Also habe ich eine Funktion entwickelt, die gut funktioniert, aber das Problem ist, dass ich einmal arbeite. Dies ist mein Code:Funktion wird nur einmal ausgeführt C

char *substring(char *string, int position, int length) 
{ 
    char *pointer; 
    int c; 

    pointer = (char*) malloc(length+1); 

    if(pointer == NULL) 
     exit(EXIT_FAILURE); 

    for(c = 0 ; c < length ; c++) 
     *(pointer+c) = *((string+position-1)+c); 

    *(pointer+c) = '\0'; 

    return pointer; 
} 
void insert_substring(char *a, char *b, int position) 
{ 
    char *f, *e; 
    int length; 

    length = strlen(a); 

    f = substring(a, 1, position - 1); 
    e = substring(a, position, length-position+1); 

    strcpy(a, ""); 
    strcat(a, f); 
    free(f); 
    strcat(a, b); 
    strcat(a, e); 
    free(e); 

} 


int main(void) { 



char username[UNLEN+1]; 
DWORD username_len = UNLEN+1; 
GetUserName(username, &username_len); 


char msg1 [] ="Good morning mr "; 

char msg2 [] ="Good evening mr "; 

insert_substring(msg1,username,17); 
printf("%s\n",msg1); 
insert_substring(msg2,username,17); 

printf("%s\n",msg2); 



    return 0; 
} 

Die Programmanzeige eine Nachricht an:

Guten Morgen Herr XXXXX

Was ich bemerke, dass das Programm führt keine Anweisung nach der zweiter Aufruf von insert_substring. Und es wird kein Fehler angezeigt. Vielleicht ist es ein Problem der lokalen Variablen In Funktionen

+0

Was ist 'UNLEN'? –

+5

Die Arrays 'msg1' und' msg2' sind gerade groß genug, um zu den Strings zu passen, mit denen sie initialisiert werden (natürlich mit dem Terminator). Der Versuch, an diese Arrays anzuhängen, schreibt * außerhalb der Grenzen * und führt zu * undefiniertem Verhalten *. –

+1

Hmm Sure 17 ist richtig als _length_? – chux

Antwort

0

Sie scheinen zu versuchen, rufen Sie Win32 API Funktionen, erhalten aktuelle Benutzername des Benutzers und Drucken einer Begrüßung Nachricht basierend auf Uhrzeit (aber Sie nicht diesen Teil noch implementieren).

Beim Verketten von zwei nullterminierten Strings müssen Sie sicherstellen, dass der Zielpuffer genügend Platz für die zwei verketteten Strings enthält.

In Ihrem Fall, Sie kennen bereits Ihren maximalen Speicherplatz benötigt, um Benutzernamen zu halten, durch die Verwendung von UNLEN Makro.

Sie können also einen Puffer mit der Größe: sizeof(msg1) + UNLEN über malloc verwenden. so etwas wie diese:

char *target_msg1 = (char *)malloc(sizeof(msg1) + UNLEN); 

Sie können sogar die lpnSize Parameter von GetUserName verwenden und so wenig Raum wie möglich zuordnen, aber da Sie Win32-Programmierung tun, ich glaube nicht, ein paar Bytes Speicher ist viel von einer Besorgnis .

Ihr Code würde wie folgt ändern:

strcpy(target_msg1, msg1); 
insert_substring(target_msg1,username,17); 
printf("%s\n",target_msg1); 
+0

Das Problem ist die Manipulation von Strings mit großer Länge. IMy Programm enthält mehr als 8 Strings mit einer Länge von mehr als 30. Und wenn ich sie anzeigen will. Zeigt Ungerechten Wert an. Sehen Sie sich den zweiten Kommentar an. – Amine

+0

Die Länge von Strings ist irrelevant, solange Sie genügend Platz in Ihrem Puffer haben. – m0h4mm4d

Verwandte Themen