Wie Start des Strings Verändern?

OP #1767200
Lesenswert?

Ich steh irgendwie auf dem Schlauch und hoffe Ihr könnt mir helfen:

Ich will in C einen Substring aus einem Char-Array extrahieren damit ich 
ihn per atoi in eine Zahl umwandeln kann. Jetzt stehen aber vor der 
eigentlichen Zahl noch fünf andere Zeichen die ich eliminieren muss.
Dazu wollte ich einfach den Zeiger vom nullten Element auf das vierte 
Element setzten

&char[0] = &char[4];

Da krieg ich jedoch die Fehlermeldung invalid lvalue assignment?
Was ich irgendwie verstehe, aber wie mach ich das sonst?
Kann ich den Kopiervorgang mit strcpy auch erst bei der vierten Stelle 
starten lassen?

Danke
Andreas
Gast #1767213
Lesenswert?

>&char[0] = &char[4];
>Da krieg ich jedoch die Fehlermeldung invalid lvalue assignment?

Der Sring ist im Speicher abgelegt und die Adresse des ersten Elements 
kann nicht verändert werden.

Aber

char feld[20];
int i;

stcpy(feld, "ABC100");
i = atoi(&feld[3]);

sollte gehen.

____________________
Oder über Pointer

char feld[20];
char *p;
int i;

stcpy(feld, "ABC100");
p= feld
i = atoi( p + 3)
OP #1767318
Lesenswert?

Ich habe es jetzt so gelöst:

strcpy(temp, &buffer[4]);
temp[6] = '\0';
int i = strtol(temp, NULL, 16);  // war nämlich auch noch ne HEX-Zahl 
als String...

und es funktioniert!
Mit dem Hilfszeiger hat es bei mir nicht geklappt. Da habe ich die 
Speicheradresse des Zeigers als i zurück bekommen.

Gefehlt hat mir unter anderem die erste Zeile, und die Info, dass ich 
den Zeiger auf das erste Element nicht ändern kann.

Vielen Dank
Andreas
#1767351
Lesenswert?

Andreas Kr schrieb:

> und es funktioniert!
> Mit dem Hilfszeiger hat es bei mir nicht geklappt. Da habe ich die
> Speicheradresse des Zeigers als i zurück bekommen.

Dann hast du irgendeinen Unsinn gemacht.

Allerdings verschärft sich in deinem Fall die Situation noch, da du 
Hex-Zahlen hast und dort natürlich die Buchstaben ein Problem sein 
können.


So würde es auch gehen
1
strncpy( temp, &buffer[4], 6 );
2
temp[6] = '\0';
3
int i = strtol( temp, NULL, 16 );

Diese Variante ist sogar besser, weil sich strncpy auch um den Fall 
kümmert, wenn du nicht 6 Zeichen für die Zahl hast, sondern weniger. 
Ausserdem wird weniger umkopiert und du musst dir keine Sorgen machen 
dass der Reststring in buffer so groß sein könnte, dass er dir temp 
überlaufen wird.

Auch das wäre eine Möglichkeit
1
char tmp = buffer[10];
2
buffer[10] = '\0';
3

4
int i = strtol( &buffer[4], NULL, 16 );
5

6
buffer[10] = tmp;

welche das Umkopieren eines Teilstrings vermeidet, was ja eigentlich 
eine gute Sache ist. Hat allerdings, wie deine Lösung, den Nachteil, 
dass die Annahme getroffen wird, dass eine 6-Zeichen Hex-Zahl 
tatsächlich im String vorliegt. Auf derartige Annahmen zu vertrauen, ist 
immer eine etwas problematische Sache, die man gerne vermeiden möchte, 
wenn es einfach geht.

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