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
Da musst du schon über einen Hilfszeiger gehen. char* ptr = &char[4];
>&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)
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.