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 nur

    int 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ß, Andy

    doch, 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.


Anmelden zum Antworten