[ERLEDIGT]argc argv -> in int Array schreiben (dynamisch)



  • Hallo,
    versuche gerade ein Programm zu schreiben, was die Argumente (NUR Zahlen) in ein int-array (dynamisch erzeugt) konvertiert.
    Bsp.: 2 32 34 1 9 8 (können beliebig viele sein, deswegen soll das array dynamisch erzeugt werden).
    Diese sind ja als String gespeichert und müssen nun in ein int konvertiert werden. Ich wollte die Werte alle in ein int-array abspeichern.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char **argv)
    { 
    	int i = 0;
    	int *array = (int*)malloc(argc * sizeof(int));
    
    	for(i=1; i<argc; i++)
    	{
    		*array = atoi(argv[i]); //Zum Konvertieren
    		//printf("Argument = %s", argv[i]);
    		//printf("\n");
    	}
    
    //Zum Ausgeben
    	for(i=1; i<=*array; i++)
    	{
    		printf("Argumente: %d", *array);
    		printf("\n");
    	}
    
    	free(array);	
    
    	return 0;
    }
    

    EDIT: Er gibt nur den LETZTEN Wert aus. Warum?
    Hoffe einer von euch sieht das Problem.

    Danke!

    Gruß
    Manda



  • mach etwa so:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main (int argc, char **argv)
    {
      int i;
      int *array;
    
      if (argc < 2)           // argc >= 2 --> eingaben sind da
      {
        puts ("no input");
        return;
      }
    
      // den ersten ueberspringen (weil der nix sinnvolles enthaelt)
      argc--;
      argv++;
    
      array = malloc (argc * sizeof(int));   // speicher anlegen
      if (!array)
      {
        puts ("no memory");
        return;
      }
    
      for (i=0; i<argc; i++)                 // werte einlesen
        array[i] = atoi(argv[i]); 
    
      for(i=0; i<argc; i++)                  // alles ausgeben
        printf("Argumente: %d", array[i]);
    
      free(array);                           // ... und tschuess
    }
    

    ^^ ungetestet
    🙂



  • Hi,

    kurze Frage zu folgender Zeile:

    for(i=0; i<argc; i++)                  // alles ausgeben
        printf("Argumente: %d", array[i]);
    

    Könnte ich der for-Schleife nicht bis "*array" laufen? Wenn ich bis "<argc" laufe, dann funktioniert es.

    Hatte den Fehler oben:

    array[i] = atoi(argv[i]); //hier hatte ich array[i] nicht uups
    

    Danke.
    Gruß
    Manda



  • MandaJohn schrieb:

    Könnte ich der for-Schleife nicht bis "*array" laufen?

    nur wenn du 'ne null am ende anhängst. und eine null als wert ist dann auch nicht möglich.
    🙂



  • Ok Super Danke dir!

    Gruß
    Manda



  • Hallo zusammen,

    ich habe im obigen Beispiel noch das Problem, dass bei 'Mehr-Ziffern-Werten' wie z.B. 5000 nur die 5 ausgegeben wird.
    Die Funktion atoi(argv[1]); nimmt bei mir nur die erste Ziffer.
    So wird aus 5000 plötzlich nur noch eine 5.

    Bin dankbar für Tipps.
    H-D



  • wenn ich in main folgendes schreibe funktioniert's:

    char test[4] = "123";
    int x;
    
    x = atoi(test);
    cout <<x <<endl;
    

    Nur wenn ich mit dem argv[] array arbeite, nimmt die Funktion atoi nur das ersten array-Element.

    Liegt das an der 2. Dimension des argv-Arrays ???



  • Hab da was gefunden:

    ich verwende Visual C++ 2008 Express Edition und habe ein C++ Konsolenanwendung erstellt.

    Mein main lautet "_tmain(...)", was nicht mit "main" zu verwechseln ist.
    Wenn ich aus _tmain ein einfaches main mache, funktioniert es plötzlich.

    Ich frage mich, was hat sich Microsoft mit _tmain wieder einfallen lassen 😡



  • Hi,

    hds schrieb:

    Ich frage mich, was hat sich Microsoft mit _tmain wieder einfallen lassen 😡

    das Internet steckt förmlich voller Antworten auf diese Frage. 😃 Erster Treffer der Google Suche nach _tmain:
    http://www.codeguru.com/forum/showthread.php?t=358349
    Du kannst dieses automatisch erzeugte Macro umgehen, indem du ein neues Projekt so erstellst:
    Neu/Projekt/VisualC++/Allgemein/Leeres Projekt
    Das Hinzufügen neuer Dateien geht dann über die Option Projekt/Neues Element hinzufügen.



  • Heisst das, dass meine Anwendung mit der atoi-Funktion nur im ANSI-Zeichenformat richtig funktioniert?
    Alte Anwendungen, die noch mit main(..) erstellt wurden funktionieren in beiden Formatierungen? Was ist das für eine Logik?

    Was ich bisher versteh' bringt mich zu dem Schluss, dass der Compiler atoi in den Fällen verbieten müsste wo _tmain Aufrufe eingesetzt werden.

    Ja, ich weiss, es ist nicht Aufgabe des Compilers....
    Aber in Anbetracht der Tatsache dass heutige Systeme mit einem unheimlich langen Rattenschwanz an alten Formaten klarkommen müssen, brauchen wir auch wesentlich intelligentere Build-Tools, die solche Fehler vermeiden helfen.
    An den Compilern wird inzwischen 20-30 Jahre rumprogrammiert und können nicht mehr als damals. Da stimmt doch was nicht!



  • hds schrieb:

    Heisst das, dass meine Anwendung mit der atoi-Funktion nur im ANSI-Zeichenformat richtig funktioniert?

    Nö, das kommt drauf an, was deine atoi Funktion machen soll und was du unter einer Anwendung im ANSI-Zeichenvorrat verstehst.

    hds schrieb:

    Alte Anwendungen, die noch mit main(..) erstellt wurden funktionieren in beiden Formatierungen? Was ist das für eine Logik?

    Warum nicht? Es gibt ja auch noch Funktionen wie _wtoi, etc.

    hds schrieb:

    Was ich bisher versteh' bringt mich zu dem Schluss, dass der Compiler atoi in den Fällen verbieten müsste wo _tmain Aufrufe eingesetzt werden.

    Ja, ich weiss, es ist nicht Aufgabe des Compilers....
    Aber in Anbetracht der Tatsache dass heutige Systeme mit einem unheimlich langen Rattenschwanz an alten Formaten klarkommen müssen, brauchen wir auch wesentlich intelligentere Build-Tools, die solche Fehler vermeiden helfen.
    An den Compilern wird inzwischen 20-30 Jahre rumprogrammiert und können nicht mehr als damals. Da stimmt doch was nicht!

    Wieso Fehler vermeiden? Es spricht doch nichts dagegen in einem Programm, das _tmain als Einstiegspunkt hat, die Funktion atoi zu benutzen, wenn das die Funktionalität des Programms erfordert. Man könnte in diesem Fall auch sagen: warum sollte ein Programm Dateien nicht im ANSI- und im UTF-16 Format bearbeiten können?
    Ein 'Verbot', wie du es forderst, wäre eine Einschränkung, ein gewisser Verlust von Flexibilität.
    Es steht einem auch noch frei, außer atoi und _wtoi die Funktionen _tstoi zu benutzen.


Anmelden zum Antworten