hallo,
ich habe ein String so "AA BBB CCC DD" definiert. Und jetzt will jedes
Block auf verscheienen stelle von anderem Variabel speichern.ZB AA auf
String_Variabel[0], BBB=String_Variabel[1] usw. Wie mache ich es am
besten.
Danke.
Sieht der String immer gleich aus? Soll heissen: Ist der Aufbau
immer gleich? Hat also AA immer 2 Stellen und BBB immer 3?
Wenn ja, dann könnte strncpy() dein Freund sein.
Wenn nein, dann musst du den aufwändigeren Weg gehen und zuerst
mal die Leerzeichen im String suchen (zb. mit strchr())
und dann die Teilstrings mit zb. strncpy() extrahieren.
Eine andere Möglichkeit wäre auch strtok() in Verbindung mit
strcpy() oder strncpy().
Frank wrote:
> nein es kann unterschiedlihe Länge haben.
Dann würde ich über strtok() und strcpy() (bzw. strncpy()) gehen.
Ist die einfachere Variante, wenn es den Fall nicht gibt, dass
ein Stringbestandteil auch fehlen kann.
hallo,
es klappt immer nicht, ich habe die Meldung:error: too few arguments to
function 'strchr'.Hier ist die Funktion, in der das String bearbeitet
wird.
void dekrypt_data()
{
char *ptrStr;
char buffer[20];
int i=0;
char dekryptString[30]="SEND AA BB CCC";
lendekryptString=strlen(dekryptString);
if(ptrStr=((char*)(strchr(dekryptString)," "))==NULL);
{ strcpy(buffer[i]=ptrStr);
i++;
ptrStr+=1;
}
else
ptrStr+=1;
}
Danke
Frank wrote:
> hallo,> es klappt immer nicht, ich habe die Meldung:error: too few arguments to> function 'strchr'.Hier ist die Funktion, in der das String bearbeitet> wird.
Das 2.te Argument für strchr ist kein String sondern ein char
(eigentlich ein int), der für das Zeichen steht, das gesucht werden
soll.
> if(ptrStr=((char*)(strchr(dekryptString)," "))==NULL);
Solange du dir nicht sicher bist, was du tust, solltest du
auf solche Ausdrucksmonster verzichten.
In der einen Zeile sind alleine 3 schwere Fehler enthalten.
> { strcpy(buffer[i]=ptrStr);
strcpy will 2 Argumente.
1
#include<stdio.h>
2
#include<string.h>
3
4
charCommand[20];
5
charCmdArg1[20];
6
charCmdArg2[20];
7
charCmdArg3[20];
8
9
unsignedchardekrypt_data(char*Data)
10
{
11
intLen=strlen(Data);
12
char*pPtr;
13
14
Command[0]='\0';
15
CmdArg1[0]='\0';
16
CmdArg2[0]='\0';
17
CmdArg3[0]='\0';
18
19
// Extrahiere das Commando, falls es einens gibt
20
pPtr=strtok(Data," ");
21
if(pPtr==NULL)
22
return0;
23
24
strncpy(Command,pPtr,sizeof(Command));
25
26
// Extrahiere das Erste Argument, falls es eines gibt
27
pPtr=strtok(NULL," ");
28
if(pPtr==NULL)
29
return1;
30
31
strncpy(CmdArg1,pPtr,sizeof(Command));
32
33
// Extrahiere das Zweite Argument, falls es eines gibt
34
pPtr=strtok(NULL," ");
35
if(pPtr==NULL)
36
return2;
37
38
strncpy(CmdArg2,pPtr,sizeof(Command));
39
40
// Extrahiere das Dritte Argument, falls es eines gibt
41
pPtr=strtok(NULL," ");
42
if(pPtr==NULL)
43
return3;
44
45
strncpy(CmdArg3,pPtr,sizeof(Command));
46
47
return4;
48
}
49
50
51
intmain()
52
{
53
charLine[]="SEND AA BBB CC";
54
unsignedcharNrArgs;
55
56
NrArgs=dekrypt_data(Line);
57
58
printf("Nr of recognized Strings: %d\n",NrArgs);
59
if(NrArgs>0)
60
printf("Command: %s\n",Command);
61
if(NrArgs>1)
62
printf("Argument1: %s\n",CmdArg1);
63
if(NrArgs>2)
64
printf("Argument1: %s\n",CmdArg2);
65
if(NrArgs>3)
66
printf("Argument1: %s\n",CmdArg3);
67
}
Falls es ein Problem darstellt, dass der Originalstring in
dekrypt_data durch die strtok zerstört wird, müsste man zunächst
eine Kopie davon anlegen.
hallo,
ich gauble es gibt einen Fehler, in der Funktion unsigned char
dekrypt_data( char* Data ) Data ist nicht definiert. ich bekomme die
Meldung: undefined reference to `strtok' überall wo strtok benutzt wird.
Frank wrote:
> hallo,> ich gauble es gibt einen Fehler, in der Funktion unsigned char> dekrypt_data( char* Data ) Data ist nicht definiert.
Dopch, Data ist definiert. Ist ja ein Funktionsparameter.
> ich bekomme die> Meldung: undefined reference to `strtok' überall wo strtok> benutzt wird.
Hast du <string.h> inkludiert?
Frank wrote:
> ja
'undefined reference' ist eine Meldung des Linkers, dass er die
Implementierung für strtok nicht finden konnte als er das komplette
Programm aus den Einzelteilen zusammenbauen sollte.
Entweder dir fehlt eine Library, oder in der Systemlibrary ist
strtok tatsächlich nicht enthalten oder bei der Installation
deines C-Systems ist irgendetwas schief gelaufen.
(Oder es gibt noch ein anderes Problem in deinem Code, das aber
mangels verwertbarem Code deinerseits, aus der Ferne nicht
diagnostizierbar ist).
hallo Karl,
das war mein Fehler ich habe avr-libc-user-manual gelesen und strtok ist
nicht definiert sondern strtok_r.
Ich habe diese kleine Routine geschrieben und es funktioniert gut aber
ich möchte auch das die verchiedenen String an der Adresse des
Arrays(data) gespeichert werden.Mit sprintf habe ich nur das erste
Zeichen.
ZB:data[0]="ring"
data[1]="2"
data[2]="to"
data[3]="5"
Danke
Frank wrote:
> hallo Karl,> das war mein Fehler ich habe avr-libc-user-manual gelesen und strtok ist> nicht definiert sondern strtok_r.
Ah. ok. Das wusste ich nicht. Jörg hat sich schon darum angenommen,
sodass das in Zukunft gefixt wird.
> Ich habe diese kleine Routine geschrieben und es funktioniert gut aber> ich möchte auch das die verchiedenen String an der Adresse des> Arrays(data) gespeichert werden.Mit sprintf habe ich nur das erste> Zeichen.
Logisch funnktioniert das nicht.
> ZB:data[0]="ring"> data[1]="2"> data[2]="to"> data[3]="5"
Wie muss eine Datenstruktur aussehen, die sowas speichern
kann?
Hinweis: Ein 1-dimensionales Array kann es schon mal nicht
sein. Ein 1-dimensinoales Array kann nur 1 String speichern.
Du willst aber viele Strings speichern, also brauchst du
zumindest ein 2-dimensionales Array.
+---+---+---+---+---+---+---+---+---+
| r | i | n | g | \0| | | | |
+---+---+---+---+---+---+---+---+---+
| 2 | \0| | | | | | | |
+---+---+---+---+---+---+---+---+---+
| t | o | \0| | | | | | |
+---+---+---+---+---+---+---+---+---+
| 5 | \0| | | | | | | |
+---+---+---+---+---+---+---+---+---+
| | | | | | | | | |
+---+---+---+---+---+---+---+---+---+
| | | | | | | | | |
+---+---+---+---+---+---+---+---+---+
Dein data ist aber nichts in der Art und Weise.
Was passiert bei dir:
data sieht so aus:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
| | | | | | | | | | | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+---+
Am Anfang lässt du sPtr auf &Data zeigen
+---+---+---+---+---+---+---+---+---+---+---+---+---+
| | | | | | | | | | | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+---+
^
| sPtr
| +-----+
+-------o |
+-----+
Dann kommt der strtok und identifiziert das erste Wort "ring"
Dieses Wort kopierst du dorthin, wo sPtr hinzeigt
+---+---+---+---+---+---+---+---+---+---+---+---+---+
| r | i | n | g | \0| | | | | | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+---+
^
| sPtr
| +-----+
+-------o |
+-----+
anschliessend machst du einen sPtr++ :
+---+---+---+---+---+---+---+---+---+---+---+---+---+
| r | i | n | g | \0| | | | | | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+---+
^
| sPtr
| +-----+
+---o |
+-----+
strtok identifiziert das nächste Wort "2"
Wieder wird es dorthin kopiert, wohin sPtr zeigt
+---+---+---+---+---+---+---+---+---+---+---+---+---+
| r | 2 | \0| g | \0| | | | | | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+---+
^
| sPtr
| +-----+
+---o |
+-----+
und sPtr wieder um 1 erhöht
+---+---+---+---+---+---+---+---+---+---+---+---+---+
| r | 2 | \0| g | \0| | | | | | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+---+
^
|
+---+
| sPtr
| +-----+
+---o |
+-----+
Der nächste strtok, das nächste Wort "to"
dorthin kopieren, wohin sPtr zeigt
+---+---+---+---+---+---+---+---+---+---+---+---+---+
| r | 2 | t | o | \0| | | | | | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+---+
^
|
+---+
| sPtr
| +-----+
+---o |
+-----+
sPtr, erhöhen
+---+---+---+---+---+---+---+---+---+---+---+---+---+
| r | 2 | t | o | \0| | | | | | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+---+
^
|
+-+
sPtr |
+-----+ |
|o------+
+-----+
strtok liefert als nächstes "5". Wieder: dorthin kopieren,
wohin sPtr zeigt
+---+---+---+---+---+---+---+---+---+---+---+---+---+
| r | 2 | t | 5 | \0| | | | | | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+---+
^
|
+-+
sPtr |
+-----+ |
|o------+
+-----+
Und so entsteht der String den du siehst.
Wie schon gesagt: Mit einem 1-d char Array kannst du das nicht lösen.
Du brauchst ein 2-d Array.
hallo Karl,
noch ein kleines Problem.Ich bekomme nicht die richtige Werte von Data
in veschiedenen Stellen.Nur data[0] klappt,für die andere Stelle bekomme
ich komische Werte. Das ist problematisch,weil ich später die Werte von
data an eine Struktur zuweisen möchte.
Danke
Schön langsam trickst du dich mit den ganzen Pointern selbst aus :-)
Was spricht dagegen, das ganze ganz einfach mit Indizes
zu machen?
(PS: char data[10[4]
Der String "ring" besteht aus 5 (!) Buchstaben! Du hast das
abschliessende '\0' vergessen. Generell lohnt es hier nicht
mit Speicherplatz zu geizen.)