Forum: Compiler & IDEs C Frage: auslesen eines *arrays[]


von Simon (Gast)


Lesenswert?

ich habe ein Parameter array

*argv[3]



in diesem argv[3] Ist ein String versteckt der so aussieht:


#30hallo#31test#32

Die Zeichen "#30"  "#31" "#32"
stellen ein hex wert da, also 0x30  (asci 0, decimal 48)
(immer 1 Byte lang)

alle anderen Zeichen sind als normale ascii Zeichen zu sehen.

Ich möchte nun einfach nur ein String ausgegeben die Zeichen die in hex 
angegeben sind sollen genauso ausgegeben werden, egal ob diese Sichtbar 
oder unsichtbar sind.

Die Ausgabe sieht dann also so aus:
1hallo2test3

von Simon (Gast)


Lesenswert?

ups kleiner Fehler:
so solls dann aussehen:

0hallo1test2

von Peter II (Gast)


Lesenswert?

Simon schrieb:
> in diesem argv[3] Ist ein String versteckt der so aussieht:
> #30hallo#31test#32

das kann irgendwie nicht sein. in einem *argv[3] sind wenn überhaupt 3 
zeiger auf strings drin. Aber nicht ein so ein String.

Beschreibe bitte noch einmal genau was du meinst

von Noname (Gast)


Lesenswert?

Nun, was immer in argv steht: Es gelangt (in der Regel) dadurch hinein, 
das Du etwas als Parameter nach dem Programmnamen angibst.

Da nicht klar wird, was Du willst und was das Problem wird, rate ich Dir 
uns anzugeben, was im allgemeinen Du als Parameter angeben willst und 
dazu ein oder zwei Beispiele zu nennen. Dann die Ausgabe die Du daraus 
erzeugen willst.

von Simon (Gast)


Lesenswert?

ok Beispiel:

Ich habe ein simples Programm, hier werden einfach nur die parameter aus 
gegeben.
je nachdem welchen Parameter ich anspreche,

argv[1] oder argv[2] gibt er mir einen String wieder und zwar genau den 
der
bei programm aufruf an Stelle 1 2 oder 3 war.


int main(int argc, char *argv[])
{
   int i;
    for (i = 0; i < argc; ++i)
    printf("argv[%d] = \"%s\"\n", i, argv[i]);

return 0;
}


Ausgabe:
argv[0] = "./executable"
argv[1] = "test"
argv[2] = "jo"
argv[3] = "#30hallo#31test#32"


und ich habe es hier auf argv[3] abgesehen.

von Noname (Gast)


Lesenswert?

Noch zur Information:

Nimm einmal an, Du gibst in der Kommandozeile ein:

"Kommando 1 2 hallo 3 Welt"

dann erhälst Du in argv eine Reihe von Zeigern auf Strings.
Ob das Kommando selbst dabei ist, hängt von dem genauen Betriebssystem 
ab. Es bestehen die Möglichkeiten:

argv[0] = "Kommando"
argv[1] = "1"
argv[2] = "2"
argv[3] = "hallo"
argv[4] = "3"
argv[5] = "Welt"

oder

argv[0] = "1"
argv[1] = "2"
argv[2] = "hallo"
argv[3] = "3"
argv[4] = "Welt"

von Noname (Gast)


Lesenswert?

>argv[1] oder argv[2] gibt er mir einen String wieder und zwar genau den
>der bei programm aufruf an Stelle 1 2 oder 3 war.

Das ist uns bekannt.

>und ich habe es hier auf argv[3] abgesehen.

Und was genau ist Deine Frage?

von Simon (Gast)


Lesenswert?

Die Ausgabe soll hier im prinziep argv[3] sein,
jedoch sollen alle "#31" in den entsprechenden ascii wert umgewandelt 
werden.

aus der #31 wuerde dann eine 1 werden, und würde ich


(0x7A -> ascii "z")

#7Ahallo in argv[3] haben, so wuerde er mir zhallo ausgeben

von Parser (Gast)


Lesenswert?

Simon schrieb:
> argv[3] = "#30hallo#31test#32"

Du hast einen ganz normalen String, den Du jetzt parsen musst.

von Noname (Gast)


Lesenswert?

>>argv[1] oder argv[2] gibt er mir einen String wieder und zwar genau den
>>der bei programm aufruf an Stelle 1 2 oder 3 war.

>Das ist uns bekannt.

Das war falsch.

Es ist unkorrekt zu sagen "oder". Die Parameter werden an definitiven 
Stellen im Array argv abgelegt. Nicht an alternativen Stellen.

Die Reihenfolge bleibt genau erhalten.

Falls Du das hier erhälst
>argv[0] = "./executable"
>argv[1] = "test"
>argv[2] = "jo"
>argv[3] = "#30hallo#31test#32"


war Deine EIngabe

"./executable test jo #30hallo#31test#32"

von Noname (Gast)


Lesenswert?

>jedoch sollen alle "#31" in den entsprechenden ascii wert umgewandelt
>werden.

Ja gut. Aber was genau ist nun Deine Frage?

von Simon (Gast)


Lesenswert?

Noname schrieb:
> Die Reihenfolge bleibt genau erhalten.
>
> Falls Du das hier erhälst
>>argv[0] = "./executable"
>>argv[1] = "test"
>>argv[2] = "jo"
>>argv[3] = "#30hallo#31test#32"
>
>
> war Deine EIngabe
>
> "./executable test jo #30hallo#31test#32"


jap, exakt so hab ich das eingegeben.
Mein Problem hat ansich garnichts mit dem argv oder mit der Parameter 
eingabe zu tun.

ich habe hier einfach in einem argv[x] einen String, diesen möchte ich 
Umwandeln.


Eingabe:  #30hallo#31
Ausgabe:  0hallo1

oder ein weiteres Beispiel:
Eingabe: #54#55#56
Ausgabe: TUV



anschliessend soll er in einen Buffer:
1
    char Buff[1025];
2
    memset(Buff, '0', sizeof(Buff)); 
3
4
/* Hier code zum umwandeln von argv[3] */
5
6
    write(sockfd, Buff, strlen(Buff));  <- schreiben der Daten

von Noname (Gast)


Lesenswert?

Ich denke ich frage jetzt zum letzten Mal: Was genau ist Deine Frage?

Unter einer Frage verstehe ich einen Satz der mit "Was", "Wie", "Auf 
welche Weise", oder einem anderen Fragewort beginnt und mit einem 
Fragezeichen endet.

von Noname (Gast)


Lesenswert?

>ich habe hier einfach in einem argv[x] einen String, diesen möchte ich
Umwandeln.

Dann tu das doch einfach. Willst Du ne Erlaubnis oder was? :-)

von Parser (Gast)


Lesenswert?

Noname schrieb:
> Willst Du ne Erlaubnis oder was?

Nö, nur den fertigen ausgetesteten gut kommentierten Code, ... sonst 
nichts.

von Simon (Gast)


Lesenswert?

Noname schrieb:
> Unter einer Frage verstehe ich einen Satz der mit "Was", "Wie", "Auf
> welche Weise", oder einem anderen Fragewort beginnt und mit einem
> Fragezeichen endet.

ok, kein Problem.


Wie muss der C code dafür aussehen, um einen String, der Zahlen als Hex 
beinhaltet (#30hallo#31) in einen Buffer zu bekommen?

#30 soll hier also in 0 umgewandelt werden

von Noname (Gast)


Lesenswert?

>Wie muss der C code dafür aussehen, um einen String, der Zahlen als Hex
>beinhaltet (#30hallo#31) in einen Buffer zu bekommen?

Nun. Er muss eine Reihe von druckbaren ASCII-Zeichen enthalten die von 
einem handelsüblichern C-Compiler als C-Code verstanden zu werden, 
dessen Compilat die ASCII-Zeichen in einem String als Hex-Zahl auffasst 
und diese in eine Zahl umwandelt.

Und gut muss er aussehen.

Meine Güte.

von Peter II (Gast)


Lesenswert?

Simon schrieb:
> Wie muss der C code dafür aussehen, um einen String, der Zahlen als Hex
> beinhaltet (#30hallo#31) in einen Buffer zu bekommen?

gehen den string zeichenweise durch
wenn ein # kommt, dann verwende atoi umd die zahl zu lesen
wandle die zahl in ein zeichen um
springe hinter die zahl
gehe zu 1 bis ende zeichenkette

von Parser (Gast)


Lesenswert?

Peter II schrieb:
> gehen den string zeichenweise durch
> wenn ein # kommt, dann verwende atoi umd die zahl zu lesen
> wandle die zahl in ein zeichen um
> springe hinter die zahl
> gehe zu 1 bis ende zeichenkette

oder einfacher ausgedrückt: p a r s e n

von Noname (Gast)


Lesenswert?

Ist heute Vollmond, oder was?

von Simon (Gast)


Lesenswert?

Peter II schrieb:
> gehen den string zeichenweise durch

Hier braucht es soetwas in der art, nur der code ist doch falsch schon 
alleine beim argv pointer funzt das nie.

 while (*argv[0] != '\0') {
        argv[0]++;
        printf("%d \n", argv[0]);
     }

von Parser (Gast)


Lesenswert?

Noname schrieb:
> Vollmond

So helle ist 's hier doch nicht.

von Peter II (Gast)


Lesenswert?

Simon schrieb:
> Hier braucht es soetwas in der art, nur der code ist doch falsch schon
> alleine beim argv pointer funzt das nie.

dann mach doch erstmal ein char* daraus

char* tmp = argv[3];

und jetzt machst du mit tmp weiter.

von Noname (Gast)


Lesenswert?

1
 while (*argv[0] != '\0') {
2
        argv[0]++;
3
        printf("%d \n", argv[0]);
4
     }

Der Code funktioniert sehr gut, hat aber mit der Aufgabe eine 
Zwei-Zeichen-Zahlenfolge in eine 8Bit Zahl umzuwandeln nichts zu tun.

Nimm mal an Du hast den String "30". Das entspricht der Zahl 0x30 falls 
Du sie als Hex-Zahl interpretierst. Das interpretieren macht für Dich 
sscanf.
sscanf hat den Vorteil, das Du die Länge des Stringteilstückes angeben 
kannst, das interpretiert werden soll. Es ist nämlich garnicht 
sichergestellt, das nach der zweiten Hex-Ziffer nicht noch eine 
Hex-Ziffer kommen kann. Die würde bei strtol auch mit behandelt werden.

Ein anderer Weg wäre, den String erstmal umzukopieren und dann mit 
strtol zu behandeln.

Das (oder vielmehr ein) Problem ist, den Umfang der Umwandlung zu 
begrenzen.

Such mal in Google unter "String umwandlung zahl". Da gibt es jede Menge 
Hinweise.

von Simon (Gast)


Lesenswert?

Jap, die Funktion tut genau das was ich will, danke für den Tipp!!

jetzt muss ich noch irgendwie zusehen das ich den string zerlegt bekomme
und er mir quasi erkennt wenn er ein "#" sieht.

1
int main(void)
2
{
3
   char c;
4
   scanf("%x", &c) != 1);
5
   printf("character = %c\n", c);
6
}

von Parser (Gast)


Lesenswert?

Das ist jetzt aber ein Benutzerdialog und keine Kommandozeile mehr. Die 
Eingabe kann so viel komfortabler gestaltet werden und die Hex Zeichen 
sind nicht mehr nötig.

Was willst Du wirklich manchen?

von Simon (Gast)


Lesenswert?

Das hier tuts auch mit sscanf.

Im moment bin ich am ausprobieren der Funktionen und versuche das 
irgendwie auf die Reihe zu bekommen


int xx = sscanf("31","%x",&c);
printf("character = %c\n", c);

von DirkB (Gast)


Lesenswert?

Simon schrieb:
> char c;
>    scanf("%x", &c) != 1);
>    printf("character = %c\n", c);

Das haut so nicht hin, da scanf bei %x einen Zeiger auf int erwartet.
Du übergibst aber einen Zeiger auf char.
Da sizeof(char) != sizeof(int) schreibt scanf da Bereiche, die nicht 
mehr zu c gehören.

von Klaus W. (mfgkw)


Lesenswert?

DirkB schrieb:
> da scanf bei %x einen Zeiger auf int erwartet.

genau genommen einen Zeiger auf unsigned int (was hier aber nichts zur 
Sache tut).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.