Strings vergleichen mit strcmp



  • Hallo,

    ich habe da mal ne Frage. Kann ich auch 2 Strings vergleichen, wenn einer davon von argv stammt?
    Also es soll so funktionieren:
    Ich übergebe meinem Programm einen String(Dateityp, z.B. txt, exe, usw.).
    Jetzt soll überprüft werden, wenn der eingebene String=txt, dann tue (z.B. printf("txt"))

    Mein Code sieht wie folgt aus

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(char *argv)
    {
            char *typ;
            char *txt="txt";
    
            sprintf(typ, "%s", argv[1]);
    
            if(strcmp(txt, typ)==0)
            printf("txt");
            else printf("nicht txt");
            printf("%s", typ);
    
    return 0;
    }
    

    Ich bekomme aber einen Segmention fault. Weiß jemand warum???? Was kann ich ändern bzw. mache ich falsch. Ich denke mal, das hat was damit zu tun, dass ich den Pointer auf argv zeigen lasse oder?

    Danke schonmal im Voraus.



  • argv ist eigtl. ein **, also ein pointer auf einen pointer. Du übergibst das hier wohl falsch, aber nachprüfen kann ich's auch nicht. demnach würde ich sagen:
    sprintf(typ, "%s", &argv[1]), vielleicht rede ich aber auch ganz großen Mist. 🙂



  • Du hast für "typ" keinen Speicher reserviert. Dann crasht sprintf() halt. Das kannst du allerdings eh weglassen.

    if(strcmp(txt, argv[1])==0)
    

    sollte funktionieren...



  • Ja, ich weiss, warum

    1. Es muss

    int main(int argc, char *argv[])...
    

    heissen, denn argv ist ein 2-dimensionales char-Array

    2. Solange du den Inhalt, worauf char *txt zeigt, nicht veränderst, ist das ok.
    Aber Vorsicht ⚠. Willst du ein Zeichen ändern, ist das weitere Verhalten
    undefiniert. Deshalb empfehle ich dir zu schreiben:

    char txt[]="txt"
    

    Der Compiler reserviert dir jetzt 3 Zeichen + '\0'. Der Inhalt kann verändert werden und führt zu keinen weiteren Problemen.

    Kannst aber auch gleich

    strcmp("txt",argv[1])
    

    schreiben



  • Habe das jetzt so geschrieben wie du gesagt hast.

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv)
    {
            char *txt="txt";
    
            if(strcmp(txt, argv[1])==0)
            printf("txt");
            else printf("nicht txt");
    
    return 0;
    }
    

    Jetzt bekomme ich den Fehler

    Name1.c: In function main': Name1.c:9: warning: passing arg 2 ofstrcmp' makes pointer from integer without a cast



  • Hmmm, das mit main hab ich ja komplett übersehen 😃



  • int main(int argc, char *argv[])
    

    oder

    int main(int argc, char **argv[])
    

    also so:

    #include <stdio.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    {
            char txt[]="txt";
    
            if(strcmp(txt, argv[1])==0)
            printf("txt");
            else printf("nicht txt");
    
    return 0;
    }
    

    die stdlib.h brauchst du hier aber noch nicht.
    Erst bei malloc 😉



  • Klar,

    Dankeschön. So ein dummer Fehler! Danke, jetzt kann ich endlich weiter arbeiten. Gott sei Dank sehen 8 Augen mehr als 2. 😉

    Danke curry-king



  • curry-king schrieb:

    int main(int argc, char *argv[])
    

    oder

    int main(int argc, char **argv[])
    

    Da ist aber ein Unterschied!
    Du meintest wohl als Alternative:

    int main(int argc, char **argv)
    


  • AJ schrieb:

    curry-king schrieb:

    int main(int argc, char *argv[])
    

    oder

    int main(int argc, char **argv[])
    

    Da ist aber ein Unterschied!
    Du meintest wohl als Alternative:

    int main(int argc, char **argv)
    

    Natürlich 😋



  • helpme schrieb:

    Ich bekomme aber einen Segmention fault. Weiß jemand warum????

    Abgesehen von der falschen Definition von int main, deswegen

    char *typ;
    sprintf(typ, "%s", argv[1]);
    

    char *typ; ist nur ein Zeiger auf niergendswo, wie willst du dort etwas schreiben, wo es keinen Platz gibt?

    char typ[200];
    sprintf(typ, "%s", argv[1]);
    

    würde gehen, allerdings, wenn strlen(argv[1]) < 200



  • Irgendwie will es nicht ganz so wie ich. Also, das mit dem strcmp klappt ja jetzt wunderbar. Habe jetzt genau das selbe Problem mit rename.

    Ich will den alten und neuen namen über argv[] einlesen und dann halt einfach umbennen und dann erhalte ich wieder nen Segmention Fehler???

    Wahrscheinlich stelle ich mich wieder nur blöd an. 🙄

    Hier mein Code:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
            char newname[50];
            char oldname[50];
            int rc;
    
            sprintf(oldname, "%s", argv[1]);
            sprintf(newname, "/home/sxh/Projekt/%s.%s.%s", argv[2], argv[3], argv[4]);
    
            if(rename( oldname, newname )==0)
            rc=0;
            else rc=1;
    
            printf("%s", rc);
    return 0;
    }
    


  • Ich nehme an, deswegen:

    sprintf(newname, "/home/sxh/Projekt/%s.%s.%s", argv[2], argv[3], argv[4]);
    

    vielleicht sind 50 Zeichen zu wenig.
    An welcher Stelle bekommst du das segfault? Was wird ausgeführt und was nicht?

    Es könnte auch sein, dass die argc nicht so übereinstimmen, wie du es willst. Wie rufst du das Programm auf? Ich würde auf jeden Fall davor testen, wie viel argc ist und dementsprechend handeln.


Anmelden zum Antworten