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
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
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.
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.
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"
>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?
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
>>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"
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:
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.
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
>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.
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
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
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]);
}
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.
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.
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.
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?
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);
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.