argv[] problem?



  • Hallo!

    Ich habe ein Programm welches den ls Befehl unter Linux nachbaut, bzw. daran schreibe ich gerade 🙂

    (Das sind nur Teile aus dem Code, natürlich sind die Dinge wie dirHandle etc. definiert)

    int main (int argc, char *argv[])
    
    if (argv[1] != "-la")
    	{
    		dirHandle = opendir(argv[1]);
    		if (dirHandle) 
    		{
    			while (0 != (dirEntry = readdir(dirHandle))) 
    			{
    				cout << dirEntry->d_name << endl;
    			}
    			closedir(dirHandle);
    		}
    	}
    	if (argv[1] == "-la")
    	{
    		cout<<"in"<<endl;
    		//User wrote: ls -la file, now we mus use the stat struct to get all file parameters :)
    		//Do the same as in the if above, just with argv[2] coz argv[1] is -la
    
    		dirHandle = opendir(".");
    		if (dirHandle) 
    		{
    			while (0 != (dirEntry = readdir(dirHandle))) 
    			{
    				cout << dirEntry->d_name << endl;
    			}
    			closedir(dirHandle);
    		}
    
    	}
    	cout<<argv[1]<<endl<<endl;
    	cout<<"here";
    

    Das Problem ist nun folgendes:

    Eingabe

    ./a.out /tmp

    Listet mir die Dateien und Ordner im /tmp Verzeichnis auf 🙂

    Eingabe

    ./a.out -la

    Passiert gar nichts, es wird argv[1] ausgegeben und "here" ausgegeben. Es wird jedoch nicht in die if Abfrage: if (argv[1] == "-la") reingegangen!!!
    Die Ausgabe von argv[1] ist auch -la also müsste ja if (-la == -la) true ergeben!

    Was könnte der Fehler sein?
    Danke für die shcnelle Hilfe!



  • argvspinnt schrieb:

    Was könnte der Fehler sein?

    Du vergleichst Zeiger miteinander (argv[1] und "-la" zeigen zwar auf identisch aussehende Zeichenketten, die aber an völlig verwschiedenen Speicheradressen stehen). Wenn du String-Inhalte vergleichen willst, nimm strcmp().



  • okay danke 🙂
    jetzt funktionierts aber eine Frage hätt ich noch:

    cout<<ctime(&fl.st_atime)<<dirEntry->d_name<<endl;
    

    gibt folgendes Ergebnis:

    Sun Jul 1 22:11:47 2007
    vidoku~

    Ich benötige aber folgendes:

    Sun Jul 1 22:11:47 2007 vidoku~

    Wie kann ich es so programmieren, dass alles in der selben Zeile steht?



  • Hallo:

    if (!strcmp(argv[1], "-la"))
    

    Ergibt:

    Segmentation fault (core dumped)

    Wie kann das sein?
    Das ganze hat 10 Minuten vorher prima geklappt!
    Die Segmentation fault kann nur die Zeile

    if (!strcmp(argv[1], "-la"))
    

    bedeutet, da ich folgendes geschrieben habe:

    cout<<"test"<<endl;
    if (!strcmp(argv[1], "-la"))
    cout<<"hinten"<<endl;
    

    Und es wird lediglich "test" ausgegeben gefolgt von "Segmentation fault"

    Danke für die Hilfe



  • ist argv[1] überhaupt ein gültiger Array-Member?

    btw.

    // anstelle
    if(a) { }
    if(!a) { }
    
    // solltest du lieber else benutzen
    
    if(a) { }
    else { }
    


  • okay hab jetzt alles rausbekommen 🙂
    Mir fehlt nur noch das problem mit der ctime() dass keine neue Zeile gemacht werden soll^^



  • Ich wußte gar nicht, daß man: ctime dort ein NewLine an die Ausgabe anhängt - aber man lernt nie aus 😉 (extra nochmal nachgesehen hat - er macht's doch)

    Da hast du zwei Möglichkeiten, ans Ziel zu kommen: Entweder du nimmst dir den Rückgabestring von ctime() und überschreibst das letzte Zeichen mit '\0' oder du verzichtest auf ctime() und baust dir das Zeitformat mit man: strftime zusammen.


Anmelden zum Antworten