Forum: Compiler & IDEs Wie Start des Strings Verändern?


von Andreas K. (andyk)


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

von Lord Z. (lordziu)


Lesenswert?

Da musst du schon über einen Hilfszeiger gehen.

char* ptr = &char[4];

von Max (Gast)


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)

von Karl H. (kbuchegg)


Lesenswert?

Andreas Kr schrieb:
> 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.

Musst du nicht.
Es reicht, wenn du atoi zeigst wo die Zahl anfängt

von Andreas K. (andyk)


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

von Karl H. (kbuchegg)


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.

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
Noch kein Account? Hier anmelden.