Ist im String eine Zahl ?



  • Zahlen sind doof. Wer versteht denn unter 48 schon einen Buchstaben...

    Nimm doch einfach
    isdigit(), isalnum(), isalpha(),... aus ctype.h

    Oder schreib wenigstens
    if('a'<=x && x<='z') { puts("kleinbuchstabe"); }

    die ganzen Zahlen im Code kann ja keiner lesen...



  • char *save_clipoi = clipoi;
    
    /* Der Inhalt des strings ist z.B. "s" */
    /* FALSE, 0-15                         */
    /* TRUE, Buchtabe oder hoeher als 15   */
    
    if ((atoi(save_clipoi) < '15') == TRUE);
        break;
    

    Leider gibt atoi immer FALSE, auch bei Buchstaben :((
    Hat jemand eine Loesung.

    mfg Oliver Kern.



  • Es gibt eine sehr schöne Funktion namens strspn()

    size_t strspn(const char *s, const char *accept)
    

    man-page schrieb:

    The strspn() function calculates the length of the initial segment of s
    which consists entirely of characters in accept.

    RETURN VALUE
    The strspn() function returns the number of characters in the initial
    segment of s which consist only of characters from accept.



  • Hallo Leute,

    sorry da habe ich mich etwas schlecht ausgedrueckt :(((

    Fuer mich ist es nur interessant das zahlen von 0 - 15 im string
    save_clipoi gesetzt sein duerfen. Was Hoeher als 15 bzw. Buchstabe im String
    ist, muss die schleife beendet werden.

    mfg Oliver Kern.



  • daa531 schrieb:

    char *save_clipoi = clipoi;
    

    atoi verändert den String nicht.

    /* Der Inhalt des strings ist z.B. "s" */
    /* FALSE, 0-15                         */
    /* TRUE, Buchtabe oder hoeher als 15   */
    

    Man kann sich in C knapper und klarer ausdrücken, als in deutschen Halbsätzten.

    if ((atoi(save_clipoi) < '15') == TRUE);
        break;
    

    < 15 -- '15' ist etwas, das man eigentlich nie braucht, ein "multibyte character." Das Semikolon ist etwas deplaziert und vermutlich widerspricht der Quelltext der Beschreibung von oben: atoi liefert immer einen Integer zurück. Wenn Du etwas wie atoi("zahl") schreibst, dann retourniert atoi Null, was offenbar kleiner als 15 ist. Steht im String etwa "13", so wird 13 zurückgegeben, was auch kleiner als 15 ist, ergo hast Du keine brauchbare Möglichkeit zwischen Zahlen und sonstigem zu unterscheiden. strtol gibt in diese Richtung mehr her. Oder Du ratterst, wie schon vorgeschlagen, durch den String durch.



  • Hm, was meinst du mit Zahl? Eine Zahl mit dem ASCII-Wert 15? Also ein nicht darstellbares Zeichen? Oder einen String aus dem Zeichen '1' und dem Zeichen '5' ?



  • daa531 schrieb:

    Hallo Leute,

    sorry da habe ich mich etwas schlecht ausgedrueckt :(((

    Fuer mich ist es nur interessant das zahlen von 0 - 15 im string
    save_clipoi gesetzt sein duerfen. Was Hoeher als 15 bzw. Buchstabe im String
    ist, muss die schleife beendet werden.

    mfg Oliver Kern.

    Und wieso hilft dir atoi dabei nicht?



  • lol, der arme. Wird hier voll erschlagen 😃



  • nein nein ich vertrage schon was HI.

    ich glaube ich habe was gefunden mit isalpha !!!

    isalpha() Liefert wahr zurueck wenn ch ein Buchstabe ist

    Danke Shade Of Mine :)))

    mfg Oliver Kern.



  • Nun komme ich doch nicht weiter :((

    Der Prototyp von isalpha ist ja,

    int isalpha (int ch);

    folgendes habe ich getestet:

    int a;
    
    a = atoi(save_clipoi);
    
    if (isalpha(a) == TRUE)
       break;
    

    geht nicht, da atoi immer (bei einen buchstaben) 0 zurueck gibt.
    Aber isalpha will einen integer-wert !
    Wie bekomme ich das gebacken das isalpha den string "s" liest bzw.
    auswertet.
    Den Wert vergleichen von 0-15 wird in einer anderen if schleife
    ausgewertet.
    Mir geht es nur darum ist das nun ein Buchstabe oder Zahl in einem String.

    Danke.

    mfg Oliver Kern.



  • Na endlich und so einfach ..... (man oh man)

    char *save_clipoi = clipoi;
    
    if (isalpha(*save_clipoi))
       break;
    

    mfg Oliver Kern.



  • Damit überprüfst Du nur, ob das erste Zeichen ein Buchstabe ist. Es gibt aber auch "5quack". atoi liefert dann 5. Ist das so geplant?



  • Ja Daniel, so ist es geplant !!!
    Im String gibt es nur 1 Zeichen, Buchstabe oder Zahl.
    Und genau dieses marco uebernimmt diese arbeit.

    Danke an allen, 73 Olli.



  • Es heißt If-Abfrage nicht If-Schleife 💡



  • daa531 schrieb:

    Ja Daniel, so ist es geplant !!!
    Im String gibt es nur 1 Zeichen, Buchstabe oder Zahl.

    Ähm, und wie kannst Du in einem solchen String s etwas unterbringen, für das atoi(s) > 9 zutrifft?



  • lol *kopfschüttel* 🙄



  • Hallo Daniel,

    #define L2PNUM 15
    
    /* Hat der User einen korrekten Port angeben ?   */
    	 for(i = 0; i < L2PNUM; i++)
    	{
        /* Wir pruefen erstmal ob im string eine Zahl oder Buchstabe steht. */
        /* Ist ein Buchstabe im string, brechen wir sofort ab, weil wir nur */
    	/* Zahlen (fuer Port) bearbeiten koennen.                           */
    		 if (isalpha(*save_clipoi))
    			 break;
    		 /* Ist die Portangabe zwischen 0 bis 15 ? */
    		 if (atoi(save_clipoi) != i) 
    			 continue;
         /* ja, er hat einen korrekten Port angeben, dementsprechend Markieren ! */
    		    port_ok = TRUE;
    

    bevor ich die funktion atoi ausfuehren kann, muss ich wissen ob
    im String ein Buchstabe oder Zahl enthalten ist.
    So nun allas klar ?!

    mfg Oliver Kern.



  • daa531 schrieb:

    Hallo Daniel,

    #define L2PNUM 15
    
    /* Hat der User einen korrekten Port angeben ?   */
    	 for(i = 0; i < L2PNUM; i++)
    	{
        /* Wir pruefen erstmal ob im string eine Zahl oder Buchstabe steht. */
        /* Ist ein Buchstabe im string, brechen wir sofort ab, weil wir nur */
    	/* Zahlen (fuer Port) bearbeiten koennen.                           */
    

    Eben das ist falsch. Du überprüfst nur, ob das erste Zeichen ein Buchstabe ist, mehr nicht. atoi liest aber mehr als den ersten Buchstaben aus. Desweiteren verstehe ich deinen Quelltext überhaupt nicht. Modifizierst Du save_clipoi wenigstens mal zwischendurch, oder führst Du einfach den gleichen Quelltext 15 mal hintereinander aus?

    bevor ich die funktion atoi ausfuehren kann, muss ich wissen ob
    im String ein Buchstabe oder Zahl enthalten ist.

    Du ignorierst den Fall, das im String Buchtsaben und Zahlen vorkommen können. Da Du Dein Problem immer noch nicht ausführlich erklärt hast:
    a) Woher kommt der String?
    b) Was soll er enthalten?
    c) Was willst Du mit dem Ergebnis machen, wenn Du herausgefunden hast, das im String das Richtige steht?
    d) Was sonst?
    e) Ist Dir klar, was Zeiger ('save_clipoi') von dem unterscheidet, auf das sie zeigen ('*save_clipoi')?
    f) Ist Dir klar, was atoi macht?

    g) Funktioniert alles so, wie Du Dir das vorstellst?



  • Eben das ist falsch. Du überprüfst nur, ob das erste Zeichen ein Buchstabe ist, mehr nicht.

    Richtig, mit isalpha ueberpruefe ich nur ob im string ein Buchstabe
    enthalten ist. Ist ein Buchstabe enthalten, brauchen wir nicht weiter
    machen, da wir nur Zahlen von 0 - 15 bearbeiten koennen.

    atoi liest aber mehr als den ersten Buchstaben aus.

    Weiter oben im Quellcode Modifiziere ich natuerlich die eingabe vom User, klar !!!
    So dass ich am ende nur ein Zeichen im String habe.

    save_clipoi = Befehlszeile vom User (z.B. "ma 2")
    save_clicnt = enthaelt die anzahl der Zeichen, die der User eingegeben hat
    (obiges Beispiel waere also 4)

    for(;save_clicnt > 1; --save_clicnt)
             save_clipoi++;
    

    Desweiteren verstehe ich deinen Quelltext überhaupt nicht. Modifizierst Du save_clipoi wenigstens mal zwischendurch, oder führst Du einfach den gleichen Quelltext 15 mal hintereinander aus?

    Sicherlich ist es schwierig wenn man nur einen kleinen Teil bzw. ausschnitt
    vom Quellcode bereitstellt. SOrry aber der ist riesen gross ....
    Desweiteren Modifiziere ich nur einige Teile fuer meinen eigenen bedarf.

    So hier ist erstmal die komplette for-schleife:

    /* Hat der User einen korrekten Port angeben ?   */
    	 for(i = 0; i < L2PNUM; i++)
    	{
        /* Wir pruefen erstmal ob im string eine Zahl oder Buchstabe steht. */
        /* Ist ein Buchstabe im string, brechen wir sofort ab, weil wir nur */
    	/* Zahlen (fuer Port) bearbeiten koennen.*/
    		 if (isalpha(*save_clipoi))
    			 break;
    		 /* Ist die Portangabe zwischen 0 bis 15 ? */
    		 if (atoi(save_clipoi) != i) 
    			 continue;
        /* ja, er hat einen korrekten Port angeben, dementsprechend Markieren ! */
    		    port_ok = TRUE;
    
       /* Ist der angegebene Port ueberhaupt aktiv ? */
      		if (!portenabled(atoi(save_clipoi))) {
       /* Port ist nicht aktiv - Fehlermeldung, funktion beenden */
                         mbp = putals("Trace is off\r");   
                         putprintf(mbp,"Fehler: Port %u ist nicht aktiv!!!\r"
                                       ,atoi(save_clipoi)); 
                          prompt(mbp);
    	             seteom(mbp);     /* senden.... */
    		   return;
    			}
    	 }
    	 if (port_ok != TRUE) {
              /* Portangebe liegt nicht zwischen 0 - 15 bzw. > 15 */
              /* oder es war keine Zahl im String! */
    

    ) Funktioniert alles so, wie Du Dir das vorstellst?

    Ja es funktioniert so wie ich es mir vorstelle !!!
    z.B. gibt ein User bloss MA ein, ohne Portnummer, ist das letzte
    Zeichen im String ein "A". Marco isalpha bricht (port_ok ist FALSE)
    die For-Schleife ab und gibt eine Fehlermeldung.

    Wo ich noch ein Problem habe, faellt mir grade auf, wenn ein User
    z.b. ma 15 macht. Das Letzte Zeichen waere in dem fall 5, sollte eigentlich
    15 sein :(((.

    Vielleicht hilft das schon aus der 1 eine 2:

    for(;save_clicnt > 2; --save_clicnt)
             save_clipoi++;
    

    Muss ich aber erstmal testen bzw. debuggen.

    mfg Oliver kern.



  • daa531 schrieb:

    for(;save_clicnt > 1; --save_clicnt)
             save_clipoi++;
    

    Das geht auch kürzer:
    save_clipoi += save_clicnt - 2;

    daa531 schrieb:

    if (atoi(save_clipoi) != i)
    

    Welchen Sinn hat denn dieses Konstrukt? Und warum die Schleife außen rundum?? Wäre es nicht einfacher abzufragen ob atoi(save_clipoi)>-1 und atoi(save_clipoi)<16 ist???


Anmelden zum Antworten