strcmp mit mehreren strings



  • Hallo,
    ich bin neu hier und habe ein größeres problem
    die funktion strcmp vergleicht ja strings miteinander
    ich soll mit
    " main (int argc, char *argv[]) "
    wörter einlesen und diese sortieren

    bin dabei auf "strcmp gestoßen

    wenn ich nun for-schleifen mache und für die strings die laufvariable i einsetze das programm uebersetze mit
    " gcc -std=c99 -Wall -pedantic "
    bekomme ich vom compiler keine Fehler angezeigt.
    Starte ich nun das Programm gebe hinter dem Programm-namen strings ein wie z.B.:
    " hallo da draussen "
    bekomme ich ein "segmentation fault"

    wenn ich einfach sage vergleiche argv[1] mit argv[2] funktioniert das alles ohne Probleme

    könnt ihr mir evtl helfen? 🙂

    /*
    */
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main (int argc, char *argv[])
    {
    	char *strings[1000];
    	int check;
    
    	for (int i = 1; i <= argc; i++)
    	{
    
    		strings [i] = argv[i];
    	}
    
    	for (int i = 1; i <= argc; i++)
    	{
    		check = strncmp (strings[i], strings[i+1], 3);
    		if (check < 0)
    		{
    			printf ("%s\t", strings[i]);
    		}
    		else
    		{
    			printf ("%s\t", strings[i+1]);
    		}
    	}
    
    return 0;
    }
    

  • Mod

    Fehler: Welche Werte kann denn der Index in Zeile 21 alle annehmen?

    Tipp zur Fehlersuche: Mit einem Debugger hättest du das schnell/sofort gefunden. Mach dich mal schlau, was ein Debugger ist und wie man ihn benutzt.

    Tipp zum Programm: Die Kopie des argv-Feldes ist total unnötig und umständlich.



  • strings[i+1] liefert einen uninitialisierten Zeiger, den strncmp versucht, zu dereferenzieren.
    strncmp ist hier sowieso fragwürdig, zumal du ja was zu strcmp fragen willst.



  • SeppJ schrieb:

    Tipp zum Programm: Die Kopie des argv-Feldes ist total unnötig und umständlich.

    Matze__93 schrieb:

    ich soll mit
    " main (int argc, char *argv[]) "
    wörter einlesen und diese sortieren

    bin dabei auf "strcmp gestoßen

    Er kann alle Wörter selten in einem Schleifendurchgang richtig sortiert ausgeben. Wäre es denn empfehlenswert, die Zeiger von argv umzusortieren, oder dies in einem separaten Array zu machen?

    int check;
    		...
    		check = strncmp (strings[i], strings[i+1], 3);
    		if (check < 0)
    		{
    			printf ("%s\t", strings[i]);
    		}
    		else
    		{
    			printf ("%s\t", strings[i+1]);
    		}
    	}
    

    check ist unnötig, da der Rückgabewert von strncmp nur einmalig verwendet wird.

    for (int i = 1; i <= argc; i++)
    	{
    
    		strings [i] = argv[i];
    	}
    
    	for (int i = 1; i <= argc; i++)
    

    argc gibt die Anzahl an Strings in argv an, also die Felder 0 bis argc-1...


  • Mod

    Youka schrieb:

    SeppJ schrieb:

    Tipp zum Programm: Die Kopie des argv-Feldes ist total unnötig und umständlich.

    Matze__93 schrieb:

    ich soll mit
    " main (int argc, char *argv[]) "
    wörter einlesen und diese sortieren

    bin dabei auf "strcmp gestoßen

    Er kann alle Wörter selten in einem Schleifendurchgang richtig sortiert ausgeben. Wäre es denn empfehlenswert, die Zeiger von argv umzusortieren, oder dies in einem separaten Array zu machen?

    Ich hatte mich nur am bisherigen Code orientiert, wo die Kopie definitiv unnötig ist, da an dem Feld nichts verändert wird. Prinzipiell darf man das übergebene Feld verändern wie man möchte, aber bei zu großen Änderungen würde ich irgendwann auch anfangen zu kopieren, weil es sich richtig anfühlt (auch wenn ich es besser weiß). Ich würde aber entweder memcpy benutzen oder gleich eine tiefe Kopie machen.



  • Hallo
    Danke erstmal fuer die Hilfe
    Hab den Fehler entdeckt
    in der for-schleife darf ich nicht schreiben
    "i <= argc"
    sondern nur
    "i < argc"

    im quellcode habe ich mich muss ich gestehen von einer Internetseite in die Irre fuehren lassen, mit strncmp hab es jetzt geändert zu strcmp.

    Dass das Array "strings" unnötig ist war mir mehr oder weniger bewusst ich dachte nur das ich den Speicher evtl ueberschrieben habe und hab es deshalb eingefuehrt.


Log in to reply