strchr angabe der position
-
Hallo,
ich habe mal folgendes kleines Testprogramm für strchr gebastelt:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 31 int main() { char string[MAX]; size_t laenge; char *ptr = NULL; printf("\nMAX = %i\n",MAX); printf("Bitte String eingeben(max. 30 Zeichen):"); fgets(string,sizeof string,stdin); laenge = strlen(string); printf("\nlaenge = %i",laenge); printf("\n"); ptr = strchr(string,'s'); if(ptr == NULL) { printf("\n's' nicht gefunden\n"); } else { printf("\n's' found at %i\n",ptr-string+1); } printf("\n"); puts(string); return 0; }
Meine Frage ist jetzt, wie genau Funktioniert die Umwandlung von
ptr-string+1
in den Integerwert? Rein logisch ist mir klar was ich wieso rechne, meine Position ist Position vom Zeichen - Anfang und +1 weil ich von 0 an zähle. Aber warum ist diese Differenz vom Typ int, wenn ich doch eigentlich Adressen / Positionen subtrahiere?! Hoffe es ist einigermaßen verständlich was ich meine?! Vielen Dank im Voraus!
Grüße
-
Die Differenz ist nicht vom Typ int, wird aber implizit in diesen Typ gecastet.
-
von welchem Typ ist meine Differenz denn genau, dass dieser inmpliziete Cast auch wirklich das gewünschte liefert?
-
Da du mit zwei char-Pointern rechnest wird das Ergebnis auch ein char-Pointer sein. Den darfst du allerdings nicht dereferenzieren, da er nicht auf gültigen Speicher zeigt. Die Rechnung ist dazu gedacht das Ergebnis in einen Ganzzahltyp zu casten.
-
wieso wird das Ergebnis denn auf nicht gültigen Speicher zeigen?! Und welcher Grundgedanke liegt dann dieser Rechnung zugrunde?
-
Janjan schrieb:
Da du mit zwei char-Pointern rechnest wird das Ergebnis auch ein char-Pointer sein.
Nein, es ist ein ptrdiff_t, ein implementation-definierter vorzeichenbehafteter Integertyp.
Janjan schrieb:
Die Differenz ist nicht vom Typ int, wird aber implizit in diesen Typ gecastet.
Wieso sollte da was implizit gecastet werden? Es kötte sein, dass der Typ z.b. long ist und die printf-Ausgabe mit %i nicht funktioniert. Man sollte es also explizit casten. (Oder gibt es printf-formatzeichen für ptrdiff_t? Keine ahnung)
-
Du hast einen Zeiger auf eine Zeichenkette, z.B. 0xaabbcc10 (verkürzte fiktive Adresse!).
Dar Zeiger auf die Zeichenkette ist quasi ein Zeiger auf das erste Zeichen. Das zweite Zeichen liegt einen Byte später im Speicher, also 0xaabbcc11.Subtrahierst du jetzt diese zwei Adressen von einander, so erhälst du den Wert 1:
0xaabbcc11
- 0xaabbcc10
------------
= 0x00000001Das ist natürlich keine gültige Adresse mehr. Aber castest du diese Adresse jetzt in einen Ganzzahltyp, so erhälst du 1 (nicht als Zeiger). Also hast du quasi die Position des Zeichens in der Zeichenkette errechnet (bei 0 startend).
-
herzlichen dank, so versteh ich das