C Frage: auslesen eines *arrays[]

Gast #2690544
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
Gast
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
Gast
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.
Gast
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.
Gast
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"
Gast
>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?
Gast
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
Gast
>>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"
Gast
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
Gast
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.
Gast
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
Gast
>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.
Gast
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
Gast
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
Gast
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.
Gast
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.
Gast
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
}
Gast
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?
Gast
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);
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.