C - argv[1] als char-Array speichern



  • Hi,

    wie kann ich den argv[1] PArameter komplett durchgehen und immer zwei und zwei Zeichen in ein Array schreiben?

    Also Parameter ist: A2E3C4...

    Und im char-Array sollte dann stehen:

    a[0]=0xA2;
    a[1]=0xE3;
    a[2]=0xC4;
    usw.

    Mit strlen() hab ich die Länge des String-Parameters abgefragt, jedoch kann ich dann nicht auf die einzelnen Zeichen des Strings zugreifen!?

    Hat jemand eine Idee bzw. Lösung?

    Liebe Grüsse.



  • Aha 🙂

    for(i = 0; i < strlen(argv[1]); ++i)
            printf("argv[1][%d] = %c (%d)\n", i, argv[1][i], argv[1][i]);
    

    So spricht man mal die einzelnen Zeichen im String an.

    Wobei beim Schreiben ins Char-Array gibts noch Probleme, weil die Form sollte dann ja so aussehen.

    a[0]=0xA2;
    a[1]=0xE3;
    a[2]=0xC4;
    usw.

    Hat jemand eine Idee bzw. Kritik am Ansprechen der einzelnen Zeichen eines Strings?



  • Kannst du vielleicht nochmal darlegen, was du genau machen möchtest?
    Deine Beschreibung ist etwas konfus imho.

    Was spricht z.B. dagegen einfach Speicher der Länge strlen(args[1])+1 zu mallocen und den String darein zu kopieren?

    🙂



  • Hmm...

    int i;
    	char* Ptr;
    
    	if (argc > 1)
    		Ptr = malloc(strlen(argv[1])+1);
    
    	for (i = 0; argv[1][i]; i++)
    	{
            printf("%X ==\t%d\t== %c \n", argv[1][i], argv[1][i], argv[1][i]);
    
    		Ptr[i] = argv[1][i];
    	}
    	Ptr[i] = 0x00;
    

    :xmas1:



  • char* Ptr;
    Ptr = malloc(strlen(argv[1])+1);

    das funktioniert nicht (inkompatible Deklaration).

    Also meine Idee ist folgende. Ich bekomme einen Parameter (AB12CD34).
    Jetzt geht meine For Schleife diesen durch und schreibt AB ins Array an die Stelle 1, dann 12 an die Stelle 2. Sinn un Zweck ist es, dass ich ASCII Codes als Hex übergeben möchte.



  • charly9687 schrieb:

    char* Ptr;
    Ptr = malloc(strlen(argv[1])+1);

    das funktioniert nicht (inkompatible Deklaration).

    Doch, das funktioniert (Du hast die Meldung nicht richtig gelesen).



  • ok, war nur eine Warnung. Aber wie bekomme ich diese weg?

    e.c: In function âmainâ:
    e.c:22: warning: incompatible implicit declaration of built-in function âmallocâ

    Hab noch ein Problem:

    Die einzelnen Stellen des Strings kann ich jetzt auslesen.

    Also der String beginnt jetzt zum Beispiel mit AF.....

    Wie kann ich jetzt aber in ein neues Array an die erste Stelle diesen Wert als 0xAF schreiben!?



  • zu deinem warning. Hört sich für mich danach an als ob du vergessen hast stdlib.h zu includen. Das dürfte die warning verschwinden zu lassen



  • Also irgendwie drehe ich mich im Kreis.

    Nochmal zu meinem Problem:

    Ich lese per Parameter oder per Eingabe von der Konsole einen String ein: Dieser enthält nur Ziffern bzw. a-f (also hex-Zeichen).

    Bsp.: 12ab34cd56

    Nun hab ich eine Schleife gebaut, die den String von Anfang bis Ende durchgeht (zuerst auf richtige Zeichen kontrolliert und ob die Anzahl der Zeichen gerade war) und immer 2 Zeichen in ein temporäres char-array schreibt. Somit filtere ich im ersten Durchlauf die 12 raus dann die ab usw.

    Aber wie kann ich jetzt diesen "String" in ein unsigned char Array schreiben, sodass es dann so drinnen steht?

    unsigned char[] = {0x12,0xab,0x34,0xcd,0x56};

    Viele Grüsse!



  • unsigned char[] string= {0x12,0xab,0x34,0xcd,0x56};

    Du willst also nur die Zahlenwerte drinnen stehen haben, denen die HEX Zahl mit den 2 Ziffern entspricht? (0x12 wird nicht tatsächlich so gespeichert, weil alles binär gespeichert wird, aber zumindest kannst du es dann ja wieder in Hex Formatierung ausgeben, geht glaub ich sogar mit printf).
    Du musst dir eine Funktion schreiben, die dir den Teilstring(also "12", "ab",...) in eine Zahl umwandelt.

    Hier der ungefähre Aufbau(habs nicht ausprobiert, aber das Grundprinzip sollte klar sein):

    char zahlTeil1=0, zahlTeil2=0, zahlGesamt;
    
    if(isnumber(string[0]))
    {
     zahlTeil1=16*(string[0]-'0');
    }
    else if(isalpha(string[0]))
    {
     if(string[0]=='a' || string[0]='A')
      zahlTeil1=16*10;
     if(string[0]=='b' || string[0]='B')
      zahlTeil1=16*11;
     usw...
    }
    
    if(isnumber(string[1]))
    {
     zahlTeil2=(string[1]-'0');
    }
    else if(isalpha(string[0]))
    {
     if(string[1]=='a' || string[1]='A')
      zahlTeil2=10;
     if(string[1]=='b' || string[1]='B')
      zahlTeil2=11;
     usw...
    }
    zahlGesamt=zahlTeil1+zahlTeil2;
    

    Die zahlGesamt kannst du dann in dein entsprechendes char Array schreiben!



  • charly9687 schrieb:

    Also irgendwie drehe ich mich im Kreis.

    Nochmal zu meinem Problem:

    Ich lese per Parameter oder per Eingabe von der Konsole einen String ein: Dieser enthält nur Ziffern bzw. a-f (also hex-Zeichen).

    Bsp.: 12ab34cd56

    Nun hab ich eine Schleife gebaut, die den String von Anfang bis Ende durchgeht (zuerst auf richtige Zeichen kontrolliert und ob die Anzahl der Zeichen gerade war) und immer 2 Zeichen in ein temporäres char-array schreibt. Somit filtere ich im ersten Durchlauf die 12 raus dann die ab usw.

    Aber wie kann ich jetzt diesen "String" in ein unsigned char Array schreiben, sodass es dann so drinnen steht?

    unsigned char[] = {0x12,0xab,0x34,0xcd,0x56};

    Viele Grüsse!

    Hmm...

    #define HEX 16
    
    int main()
    {
    
        char s[] = "12ab34cd56";
        unsigned char a[5];
    
        char tab[HEX+1] = "0123456789abcdef";
        int i, j, k = 0;
    
        for (i = 0; i < (sizeof(s)-1); i++)
            for (j = 0; j < HEX; j++)
            {
                if (s[i] == tab[j])
                {
                    if (!(i&1))
                    {
                        a[k] = (unsigned char)(j<<4);
                        j = 0;
                        i++;
                        continue;
                    }
                    else
                    {
                        a[k] |= (unsigned char)j;
                        k++;
                        break;
                    }
                }
            }
    
        return 0;
    }
    

    :xmas1:



  • Ok thx, noch ein kleines Problem.

    Die Methode isalpha() hab ich in der ctype.h gefunden, jedoch die Methode isnumber() finde ich nirgends. 😞



  • ah das Posting von Wilma hab ich erst jetzt gesehen. 🙂



  • charly9687 schrieb:

    Ok thx, noch ein kleines Problem.

    Die Methode isalpha() hab ich in der ctype.h gefunden, jedoch die Methode isnumber() finde ich nirgends. 😞

    probier isnumeric()



  • habs mit isdigit() gemacht



  • noch ein kleines Problem:

    Wenn ich dies hier definiere:

    unsigned char test [] = {0x11, 0x22, 0x33, 0xff, 0xfe, 0x11, 0x22, 0x33}
    dann bekomme ich mit sizeof(test13) die Anzahl der elemente (also 8).

    Wenn ich es nun so mache:

    unsigned char* sum;
    sum=malloc(strlen(argv[1])/2+1);

    Dann bekomme ich mit size(sum) nur die Größe des Variablentyps.

    Zum Auslesen des Array, das dynamisch gefüllt wurde, muss ich die Anzahl der gesamten Elemente wissen, damit ich diese dann auch wieder ausgeben kann.

    Jemand eine Idee, wie ich das realisiere?

    Weil soetwas wie unsigned char sum [argv[1]/2] funzt ja sicher nicht!?



  • Du musst das zusätzlich irgendwo speichern, so einfach so kann man es nicht erraten, wielange ein Array ist.
    Du kannst ja in einer Variable speichern wie lang das Array ist.
    long size=argv[1])/2. (das +1 ist glaub ich nicht richtig, da es sicht ja um keinen String, sondern um ein stinknormales char Array handelt).
    Und beim Ausgeben musst du halt diese size Variable berücksichtigen.

    Alternativ kannst du das natürlich "schön" strukturieren mittels struct:
    struct meineStruktur
    {
    char *array;
    long size;
    };



  • Ok so hab ich es dann eh gemacht. C ist schon etwas anders. 🙂


Anmelden zum Antworten