syntax on getchar();
-
hallo. ich möchte eine eine zeichenkette die der beutzer eingibt mittels
getchar() in ein feld einlesen, krieg das aber vond er syntax noch nicht so ganz hin. habs so veruscht:STR30 *string30_einlesen() {
/*STR30 ist vorher als feld mit 30 elementen definiert worden*/
int i=0;
STR30 feld;
for(i=0; i<29 ; i++) {
getchar();
feld[i]=getchar();
}
feld[i+1]='\0';
return feld;
}
aber das klappt nicht, kann mir jemand sagen was falsch ist?
danke. MfGMarco
-
feld[i+1]==29+1->30-> das 31te Element im array
Ergo, nicht deklariert, wandert ins Nirvana!
-
Ich würde das so machen:
typedef char str30[30]; void ReadLine(str30 String) { int i = 0, c; while ((c = getchar()) != EOF && c != '\n' && i < 30-1) { String[i++] = c; } String[i] = 0; }
-
wenn cih das so amche, kennt der das "string" denn dann auch ncoh ausserhalb der funktion. kann ich also die funktion aufrufen und danach das string[] feld in ein anderes kopieren? ode muss cih dann mit return arbeiten?
-
habs jetzt so, möchte als rückgabewert den zeiger auf das feld haben. der sagt mir aber in der letzten zeile, also bei der return anweisung: "different levels of indirection"
was ist da falsch?STR30 *string30_einlesen()
{
int i = 0 , c;
STR30 String;
while ((c = getchar()) != EOF && c != '\n' && i < 30-1) {
String[i++] = c;
}
String[i] = 0;
return(String);
-
char *string30_einlesen()
{
int i = 0 , c;
STR30 String;
while ((c = getchar()) != EOF && c != '\n' && i < 30-1) {
String[i++] = c;
}
String[i] = 0;
return (String);
}so klappt es jetzt soweit, wenn cih dann aber die funktion aufrufe und danch was mit String machen möchte also ausdrucken oder in ein anderes feld schrieben doer sonstwas, dann sagt der compiler, dass string ein undeclared identifier ist...wieso, cih hab ihn doch als rückgabewert...
-
dein code ist falsch, du kannst keinen zeiger auf eine lokale variable zurück geben. (lies dir n tutorial über zeiger durch - ist n sehr kompliziertes gebiet)
nimm madys Lösung -> da muss der caller den string anlegen und an die funktion übergeben.
-
Original erstellt von wasserball6:
so klappt es jetzt soweit, wenn cih dann aber die funktion aufrufe und danch was mit String machen möchte also ausdrucken oder in ein anderes feld schrieben doer sonstwas, dann sagt der compiler, dass string ein undeclared identifier ist...wieso, cih hab ihn doch als rückgabewert...Ja, aber String ist ja lokal und nicht global deklariert. Würdest du das global machen, könntest du auch String lesen. Also ich sehe 4 Möglichkeiten:
1. du machst es so in etwa wie mady,
2. du allozierst Speicher für String in der Funktion (ansonsten würde der Speicher nach dem Funktionsaufruf wieder frei gegeben werden)
3. du machst String static (weiß grad nicht, ob das geht, aber theoretisch...)
4. du übergibst String per call by reference, sodass von der Funktion direkt auf den Speicher geschrieben werden kann, welcher dann in der aufrufenden Funktion natürlich noch zur Verfügung steht.
-
Mal ne Frage zu Madys Beispiel. Ich verstehe nicht, wofür der Caller einen String übergeben muss:
void ReadLine(str30 String)
Bekomme immer Segmentation Fault...
-
CarstenJ schrieb:
Mal ne Frage zu Madys Beispiel. Ich verstehe nicht, wofür der Caller einen String übergeben muss:
void ReadLine(str30 String)
Bekomme immer Segmentation Fault...
kapier ich nicht.
wie lautet die frage?der code ist nur eine deklaration (bekanntmachung) - da hier kein code ausgefuerht wird, kann auch nix abstuerzen.