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
Simon schrieb: > argv[3] = "#30hallo#31test#32" Du hast einen ganz normalen String, den Du jetzt parsen musst.
>>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"
>jedoch sollen alle "#31" in den entsprechenden ascii wert umgewandelt >werden. Ja gut. Aber was genau ist nun Deine Frage?
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 |
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.
>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? :-)
Noname schrieb: > Willst Du ne Erlaubnis oder was? Nö, nur den fertigen ausgetesteten gut kommentierten Code, ... sonst nichts.
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.
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.
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 | }
|
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.