char zeiger enlesen
-
icarus2 danke aber ich möchts mal mit den Pointern schaffen
DirkB Danke
scanf("%19s", pstadt); printf("%s", pstadt);
das ist genial, so wollt ich das Programm sowieso mal austricksen. Es hat mich einfach nie mit den Pointern einlesen lassen.
aber nun kommt schon der nächste fehler
bei:selectCity(city,20,*pstadt);
kommt Segmentation fault.
Das müsste doch rein von der Logik her funktionieren oder ?
long selectCity(struct City_s city[], long len, char *name) { int i=0; for(i=0; i<LEN;i++) { if(strcmp(city[i].name,*name))
-
Taylor schrieb:
aber nun kommt schon der nächste fehler
bei:selectCity(city,20,*pstadt);
kommt Segmentation fault.
Das müsste doch rein von der Logik her funktionieren oder ?
Nein, das stimmt nicht aus zwei Gruenden:
1. Als Laenge solltest du LEN uebergeben und nicht 20. In der Funktion bestimmt doch LEN die Laenge des city Arrays und nicht von name.
2. Du musst als drittes Argument einen Zeiger uebergeben. Das machst du jetzt allerdings nicht, denn du dereferenzierst den Zeiger. Ohne den * beim Aufruf muesste es klappen.
-
Du hast es noch nicht verstanden:
*pstadt ist kein Zeiger auf char. Das ist pstadt (ohneMit *pstadt greifst du auf den Wert zu, auf den pstadt zeigt. Das ist ein einzelnes Zeichen.
Deine Funktion (und auch printf) erwarten aber ZeigerUnd stadt und &stadt[0] sind äquivalent. Solange du den Zeiger nicht verändern willst (z.B. mit ++ ) lass pstadt weg.
Und auch strcmp erwartet zwei Zeiger.
-
aja danke icarus2,
aber es kommt trotzdem Segmentation fault.
hier noch mal das ganze Programm:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define LEN 20 #define MAX(a,b) ((a) > (b) ? (a) : (b)) struct City_s { char name[30]; char country[5]; long inhabitants; }; void printCity(struct City_s *city) { printf("Name: %s, Country: %s, Einwohner %ld \n",city->name, city->country, city->inhabitants); }
[cpp]**
long selectCity(struct City_s city[], long len, char *name)**[/cpp]{ int i=0; for(i=0; i<LEN;i++) { if(strcmp(city[i].name,*name)) { return i; } else { return -1; } } } long largestCity(struct City_s city[], long len) { } int main() { char stadt[20]; char *pstadt; pstadt = stadt; struct City_s city[LEN]= { {"Wien", "A", 1700000 }, {"Graz", "A", 255000 }, {"Berlin", "D", 3430000 }, {"Zurich", "CH", 365000 }, {"Kopenhagen", "DK", 1168000 } }; printf("Geben sie eine Stadt ein:\n"); scanf("%19s",pstadt); printf("%s \n", pstadt);
[cpp] selectCity(city,LEN,pstadt);[cpp]
[cpp]// for(i=0; j<city[i].inhabitants; i++)
// {
// printCity(&city[i]);
// }}
[/cpp]die meiner Meinung nach falschen Stellen hab ich dick gemacht. hoffe man findet sie so leichter.
mfg
-
Ein Fehler befindet sich in Zeile 5 (des zweiten Code-Snippet). strcmp erwartet zwei Zeiger als Argumente. Das muss also lauten
if( strcmp(city[i].name, name) )
ohne *, denn sonst dereferenzierst du den Zeiger 'name' und dann ist es kein Zeiger mehr.
Vielleicht solltest du kurz etwas mit einfacheren Beispielen zu Zeigern rumprobieren und testen. Das koennen ganz einfache Beispiele sein wie z.B. einen Zeiger auf int an eine Funktion uebergeben und dann dort mit printf ausgeben usw.
-
DirkB schrieb:
Und auch strcmp erwartet zwei Zeiger.
long selectCity(struct City_s city[], long len, char *name) { .... if(strcmp(city[i].name,*name)) ^ Der * muss weg
Du kannst es dir so merken:
Da steht *char name dann ist *name (mitein char.
Ohne * ist es der Zeiger.
-
ok danke.
Man das is ne schwere Geburt ^^das mit dem einlesen funktioniert aber igendwas ist mit der for schleife los. ich bekomm immer als Rückgabewert 0 zurück. Das ist doch unmöglich...
#include <stdio.h> #include <stdlib.h> #include <string.h> #define LEN 20 #define MAX(a,b) ((a) > (b) ? (a) : (b)) struct City_s { char name[30]; char country[5]; long inhabitants; }; void printCity(struct City_s *city) { printf("Name: %s, Country: %s, Einwohner %ld \n",city->name, city->country, city->inhabitants); } long selectCity(struct City_s city[], long len, char *name) { int i=0; for(i=0; i<LEN;i++) { if(strcmp(city[i].name,name)) { return i; } } return -1; } long largestCity(struct City_s city[], long len) { } int main() { char stadt[20]; char *pstadt; pstadt = stadt; struct City_s city[LEN]= { {"Wien", "A", 1700000 }, {"Graz", "A", 255000 }, {"Berlin", "D", 3430000 }, {"Zurich", "CH", 365000 }, {"Kopenhagen", "DK", 1168000 } }; printf("Geben sie eine Stadt ein:\n"); scanf("%19s",pstadt); printf("%s \n", pstadt); printf("Rueckgabe: %.0f \n",selectCity(city,LEN,pstadt)); if(-1 == selectCity(city,LEN,pstadt)) { printf("Fehlermeldung"); } else { printCity(&city[selectCity(city,LEN,pstadt)]); } // for(i=0; j<city[i].inhabitants; i++) // { // printCity(&city[i]); // } }
-
Hast du dir schon mal den Rückgabewert von strcmp angesehen?
Was es bedeutet wenn ein Wert ungleich 0 zurück gegeben wird?
-
Und hier ist das nächste Problem:
printf("Rueckgabe: %.0f \n",selectCity(city,LEN,pstadt));
%f erwartet eine Variable vom Typ double oder float. selectCity gibt aber ein long zurück. Das passt nicht.
-
Danke ich glaub es funktioniert.
Ohne euch hätt ich es garantiert nicht geschafft. Danke Danke Danke !mfg
-
Noch ein Hinweis:
%s liest bei scanf nur bis zu einem Whitespace (Leerzeichen, Zeilenvorschub und Tabulatoren)
Bei "New York" bekommst du also nur das New.