2016-11-05 5 views
0

Ich habe ein Problem mit der Tolower-Funktion. Versucht, es mit argv zu verwenden, aber die Ausgabe war $ 0 @. Was ist falsch an meinem Code?Falsche Ausgabe von der Tolower-Funktion

#include <stdlib.h> 
#include <stdio.h> 

void makeLower(char *s) { 
    int i; 
    for(i = 0; s[i] != '\0'; i++){ 
     s[i] = tolower(s[i]); 
     } 
     printf("%s", s); 
} 

int main(int argc, char *argv[]) { 
    argv[0]="A"; 

    makeLower(argv); 
    return 0; 
} 
+2

Sie können nicht zuverlässig in Zeichenfolgenliterale schreiben; Sie rufen ein undefiniertes Verhalten auf, wenn Sie dies tun. Ändere das 'main()' in 'int main (void) {char str [] =" A "; makeLower (str); zurückgeben 0; } 'zum Beispiel. Sie sollten dem 'printf()' eine neue Zeile hinzufügen; Sie sollten wahrscheinlich in der 'main()' -Funktion anstelle der (nicht mehr allgemeinen) Dienstprogrammfunktion drucken. Technisch sollten Sie ein 'int' übergeben, das entweder ein' unsigned char' oder EOF zu 'tolower()' enthält (normalerweise erreicht durch 'tolower ((unsigned char) s [i])'). Sie werden jedoch kein Problem mit "A" bekommen. –

+1

Vielleicht ist dein Missverständnis bereits, dass du versuchst, 'argv [0] 'etwas zuzuordnen. Diese sollten Informationen aus Ihrer Umgebung enthalten, insbesondere sollte 'argv [0]' der Name Ihres kompilierten Programms sein. Wenn Sie es einfach ohne die Zuweisung zu "A" ausführen, dann sollten alle Zeichenfolgen, auf die "argv" verweist, geändert werden. –

Antwort

0

argv ist ein Zeiger auf Zeiger, die eine char** ist. Aber die Funktion nimmt eine char*. Also, müssen Sie passieren wie:

makeLower(argv[0]); 

Aber das wird nicht funktionieren, weil die argv[0] zeigt nun auf einen Stringliteral. Ändern eines Zeichenfolgenliterals ist undefined.

Statt einen änderbaren Array übergeben werden wie:

int main(int argc, char *argv[]) { 
    char arr[] = "A"; 

    makeLower(arr); 
    return 0; 
} 

Andere Option ist eine Kopie des Stringliteral übergeben zu machen (über argv[0]) und dann werden Sie in der Lage sein, es zu ändern. Die Idee ist, dass Sie String-Literale in C nicht ändern dürfen.