Wie splitet man eine Zeichenkette auf?

#1307276
Lesenswert?

Dibo schrieb:
> Hallo Zusammen,
>
> ich möchte gerne eine Zeichenkette des Typs char mit z.B. folgendem
> Inhalt "1AD7C8" immer paarweise aufspliten also 1A D7 C8 und dann an
> jedes Paar 0x voranstellen, so dass ma dies hier erhält 0x1A,0xD7,0xC8.
> Wie kann man dies erreichen?

Deine Zeichenkette ist sicherlich nicht vom Typ char, sondern vom Typ 
char[], also ein Array von Charactern.
Du kannst also ganz normale Arrayzugriffe nehmen.
1
  char string[] = "1AD7C8";
2

3
  int len = strlen( string );
4
  int i;
5

6
  char HexByte[5];
7

8
  for( i = 0; i < len; i += 2 ) {
9
    HexByte[0] = '0';
10
    HexByte[1] = 'x';
11
    HexByte[2] = string[i];
12
    HexByte[3] = string[i+1];
13
    HexByte[4] = '\0';
14

15
    printf( "%s", HexByte );
16
  }

http://www.mikrocontroller.net/articles/FAQ#Wie_funktioniert_String-Verarbeitung_in_C.3F
#1307321
Lesenswert?

z.B. so:
1
#include <string>
2
#include <iostream>
3

4
int main ()
5
{
6
  std::string    einstring( "1AD7C8" );
7

8
  for( std::string::size_type i=0; i<einstring.size(); i+=2 )
9
  {
10
    std::string hexString( "0x" );
11
    hexString += einstring.substr( i, 2 );
12
    std::cout << "hexString = <" << hexString << ">" << std::endl;
13
  }
14
}
Gast #1307334
Lesenswert?

Also ich als Gelegenheits-C-Programmierer finde das erste Beispiel 
wesentlich übersichtlicher. Nur weil das zweite C++ nutzt, ist es noch 
lange nicht besser vertständlich und/oder besser wartbar.
#1307341
Lesenswert?

Wenn man C kennt und weniger C++, dann ist C++ natürlich kein Geschenk.
Wenn er aber eine C-Version hat und fragt, wie es denn in C++ mit
C++-Mitteln geht (so habe ich die Frage zumindest interpretiert,
wenn es in Richtung std::string gehen soll), dann gebe ich ihm halt C++.
Du magst C lieber? Damit habe ich kein Problem, nimm es doch.
Ich habe nie behauptet, daß meine Lösung irgendiwe schöner, bunter,
geiler oder basisdemokratischer wäre - es ist halt die C++-Art passend
zum C-Beispiel von KHB. Soll jeder nehmen was ihm gefällt, und das
andere in Grund und Boden verdammen.
Und ja, man kann es auch noch in ASM machen.
#1307925
Lesenswert?

zwieblum schrieb:
> hm, aber die C und C++ version machen was anderes.

Da hat er recht :-)
1
std::string s = "1AD7C8";
2

3
  for (std::string::size_type i=0; i<s.size(); i+=2) {
4
    std::cout << "0x" << s.substr( i, 2 ) << std::endl;
5

6
    // oder auch
7
    // std::cout << "0x" << s[i] << s[i+1] << std::endl;
8
  }

> irgendwie ist mir der C code sympatischer :-)

Mir nicht. In der Praxis hat man ja eher selten den Fall, dass man den 
String direkt im Programm vorliegen hat, sondern ihn von irgendwoher 
kriegt. Und dann kann std::string seine Vorteile so richtig ausspielen 
:-) Mit C beginnt dann immer die Zitterpartie: Wie gross dimensionier 
ich denn nun das Array.
Gast #1307944
Lesenswert?

Ja, das ist dann der Fall, wenn man Tage in einem Programm mit mehreren 
Hunderttausend Zeilen Code nach einem Memory Bug sucht und dann die 
Zeile:
1
 ptr = malloc(10000); /* just a wild guess */

findet. :-)
Gast #1308588
Lesenswert?

Vielen Dank für die tollen Antworten. Ich habe jetzt Lösungsvorschlag 
Nummer 2 verwendet der funktioniert einwandfrei.
Meine nächst Frage wäre, wie übergebe ich das HexByte an ein Array?
Das Array erwartet folgende Werte unsigned char 
array[]={0x1A,0xD7,0xC8};
#1308701
Lesenswert?

Dibo schrieb:
> Vielen Dank für die tollen Antworten. Ich habe jetzt Lösungsvorschlag
> Nummer 2 verwendet der funktioniert einwandfrei.
> Meine nächst Frage wäre, wie übergebe ich das HexByte an ein Array?
> Das Array erwartet folgende Werte unsigned char
> array[]={0x1A,0xD7,0xC8};

Kannst du bitte das nächste mal deine Frage gleich richtig und 
vollständig formulieren.

Du willst in Wirklichkeit gar nicht das, was du in deiner Anfrage 
gefragt hast.

Was du willst ist:
Du bekommst einen String.
Aus dem String sind jeweils 2 Zeichen zu entnehmen, diese Zeichen als 
Hex-Zahl zu interpretieren und in einem Array abzuspeichern.

Wichtig ist der Teil: Als Hex-Zahl zu interpretieren bzw. in eine solche 
umzuformen
1
unsigned char HexDigit( char c )
2
{
3
  if( c >= '0' && c <= '9' )
4
    return c - '0';
5

6
  if( c >= 'A' && c <= 'F' )
7
    return c - 'A' + 10;
8

9
  if( c >= 'a' && c <= 'f' )
10
    return c - 'a' + 10;
11

12
  return 0;
13
}
14

15
unsigned char HexNumber( char d1, char d2 )
16
{
17
  return HexDigit( d1 ) * 16 + HexDigit( d2 );
18
}
19

20
...
21

22
  char string[] = "1AD7C8";
23
  unsigned char result[20];
24

25
  int len = strlen( string );
26

27
  int i;
28
  int j;
29

30
  j = 0;
31

32
  for( i = 0; i < len; i += 2 ) {
33
    result[j++] = HexNumber( string[i], string[i+1] );
34
  }
35

36
  ...
Gast #1308714
Lesenswert?

Danke für die Antwort.
Mein String Array das ich habe ist schon in Hex codiert und ich möchte 
immer paaweise 0x davor schreiben wie es deine Funktion weiter oben 
schon macht und diese dann dem Array übergeben. Muss man bei dem 
übergeben an das Array auch Kommas mitübergeben weil ich muss in Main 
die Eingabe unsigned char array[]={0x1A,0xD7,0xC8}; machen damit dieses 
Codes im PDU Format zu ASCII convertiert werden.
#1308736
Lesenswert?

Dibo schrieb:
> Danke für die Antwort.
> Mein String Array das ich habe ist schon in Hex codiert und ich möchte
> immer paaweise 0x davor schreiben wie es deine Funktion weiter oben
> schon macht und diese dann dem Array übergeben. Muss man bei dem
> übergeben an das Array auch Kommas mitübergeben weil ich muss in Main
> die Eingabe unsigned char array[]={0x1A,0xD7,0xC8}; machen damit dieses
> Codes im PDU Format zu ASCII convertiert werden.

Oh Mann.
Kannst du bitte deine Informationen alle auf einmal geben und nicht in 
Scheibchen?

Du willst also C-Quelltext erzeugen, oder was?
#1308738
Lesenswert?

Dibo schrieb:
> ich habe diese funktion nicht selber geschrieben. in der main ist es so
> beschrieben die werte so zu übergeben damit sie richtig convertiert
> werden.

Ich denke, du solltest erst mal C lernen.
Einem Array kann man nichts 'übergeben'. In ein Array werden Werte 
geschrieben.
Gast #1308758
Lesenswert?

OK sorry wenn ich wenn umständlich ausgedrückt habe, ich möchte die 
Werte 0x1A,0xD7,0xC8 in das Array schreiben so dass das selbe bewirkt 
wird wie ein Aufruf in Main mit unsigned char array[]={0x1A,0xD7,0xC8}; 
Das Array wird dann in einer Funktion convert(array,länge,&speicherort) 
übergeben.
#1309058
Lesenswert?

Ich denke, was dir fehlt ist die Erkentnis, dass 0x1A nur eine bestimmte 
Schreibweise für eine Zahl ist.
In
1
int main()
2
{
3
  unsigned char array[]={0x1A,0xD7,0xC8};

wird im Array nicht "0x1A" gespeichert, sondern eine Zahl in ihrer 
Binärform. Ob man die Zahl 26 als 26 schreibt oder als 0x1A ist Jacke 
wie Hose. Es ist in beiden Fällen dasselbe Bitmuster, welches in beiden 
Fällen dieselbe Zahl repräsentiert. Obiges ist völlig gleichwertig zu
1
int main()
2
{
3
  unsigned char array[]={ 26, 215, 200};

D.h. die Lösung, die aus dem String die Zahlen generiert und im Array 
ablegt, ist schon das was du willst.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren