String einer Funktion übergeben
-
Abend.
Ich bekomme es ums Verrecken nicht hin einer Funktion einen String zu übergeben und auf diesen dann auch wieder zuzugreifen.
int main { void kontrolle (String); String text; text = "beispiel"; kontrolle(String); } void kontrolle (String einText) // erlaubt er mir nicht: String sei unzulässig { ; }
-
was willst du auch einen (nicht standardmäßigen) Datentypen mit deiner Funktion "kontrollieren"? Wie wär's mit kontrolle(text); statt kontrolle(String)?
-
sers,
1. dein main() sollte einen int returnen!
2. ich würds so machen!
void kontrolle(char *); int main() { char array[15]; strcpy(array,"Hallo Welt\n"); kontrolle(array); return 0; } void kontrolle (char *array) { printf("%s\n", array); }
-
String text;
Soweit ich weiß gibts doch in ANSI C gar keinen String Datentyp. Dann schon eher
char[30] string = "beispiel";
Wenn du dann
kontrolle(string);
machst, übergibt er die Adresse des char Vektors. Du musst dann nur auch einen Pointer in der Fkt. "empfangen":
void kontrolle (char* einText) // Pointer auf einen char { ; }
Mist, /bin/bash0R war schneller!
-
1. dein main() sollte einen int returnen!
int main(?)
wenn du schon klugscheisserst, dann doch bitte richtig
-
Von mir aus - einer muss ja richtig klugscheißen - Standardkonform heißt das
[cpp]
int main(void) {
/* ... */
}
[/cpp]
int main() wird zwar von (fast?) allen Compilern angenommen, aber ANSI-C99 definiert als Formen für main nurint main(void); int main(int argc, char *argv[]);
und bemerkt außerdem, dass
int main(int argc, char **argv);
äquivalent zur zweiten Form ist und ebenfalls von jedem ANSI-C-konformen Compiler angenommen werden muss.
Für alle, denen der Unterschied nicht klar ist,
void f() { } void g(void) { } // ... int x; f(x); // gültig g(x); // ungültig
-
Okay, ich habs jetzt mal nach folgender Methode probiert:
void kontrolle(char *);
int main()
{
char array[15];
strcpy(array,"Hallo Welt\n");kontrolle(array);
return 0;
}void kontrolle (char *array) {
printf("%s\n", array);
}Mein Programm funktioniert aber immer noch nicht; es soll das Textfeld löschen, wenn der Inhalt keine Int-Zahl ist:
// main: // Kontrolle, ob String ein Int-Wert ist: bool bflag = true; char *cText, cTextArray[50]; String strText; int laenge = 0 ; strText = Edit1->Text; // Einlesen als String cText = strText.c_str(); // Umwandeln in 0-terminierten String strcpy(cTextArray, cText); // Pointer-Adresse ins Arrey übergeben laenge = strText.Length() ; // die Länge muss mitgeschickt werden!! bflag = Auto.IsNumeric(cTextArray, laenge); if(!bflag) // muss die Eingabe zurückgesetzt werden -> sonst Fehler!! { Edit1->Text = ""; } }
// Methode / Funktion: bool Fahrzeuge::IsNumeric (char *cTextArray, int laenge) { int icount; bool bflag=true; for( icount=0 ; icount <= laenge ; icount++ ) { switch(cTextArray[icount]) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': break; default: bflag = false ; break; } } return bflag; }
Wirkt jetzt halt n bissl dick, ist aber absolut nicht so!
Gruß, Andy
-
Andy-Ypsi schrieb:
Wirkt jetzt halt n bissl dick, ist aber absolut nicht so!
Gruß, Andydoch, ist zu dick.
die länge brauchste nicht und das switch/case kann man auch vereinfachen. probier sowas in der art:int isNumeric (char *txt) { while(*txt) { if (*txt > '9' || *txt < '0') return 0; txt++; } return 1; }
-
Wie wärs mit der einfachen Variante?
int is_number(char *s) { char *test; if(s[0] == '\0') return 0; strtol(s, &test, 10); return *test == 0; }
Auf die Art kriegst du auch gleich negative Zahlen abgeprüft.