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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.