mikrocontroller.net

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


Autor: Andreas Kr (andyk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lord Ziu (lordziu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da musst du schon über einen Hilfszeiger gehen.

char* ptr = &char[4];

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Kr (andyk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
strncpy( temp, &buffer[4], 6 );
temp[6] = '\0';
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
char tmp = buffer[10];
buffer[10] = '\0';

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

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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.