Ist im String eine Zahl ?



  • 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???



  • Wäre es nicht einfacher abzufragen ob atoi(save_clipoi)>-1 und atoi(save_clipoi)<16 ist???

    Nein das geht nicht !
    Wenn Buchstaben im String enthalten sind, bringt mir atoi falsche Werte !

    save_clipoi += save_clicnt - 2;

    Ok das teste ich mal.
    Bin ja noch "C Einsteiger", bin fuer jeden TIP dankbar.

    mfg Oliver Kern.



  • daa531 schrieb:

    Wäre es nicht einfacher abzufragen ob atoi(save_clipoi)>-1 und atoi(save_clipoi)<16 ist???

    Nein das geht nicht !
    Wenn Buchstaben im String enthalten sind, bringt mir atoi falsche Werte !

    Dann teste doch einmal ob nur Ziffern drin sind, und dann einmal ob der Wert zwischen -1 und 16 liegt...



  • Hallo Shade Of Mine,

    Dann teste doch einmal ob nur Ziffern drin sind, und dann einmal ob der Wert zwischen -1 und 16 liegt...

    Ja sicher kann man auch nach Ziffern testen, waere auch eine Moeglichkeit !

    Aber mit isalpha geht es auch. Ist ein Buchstabe im string, verlassen wir
    die for-schleife, ansonsten muss das eine Zahl sein.

    Ich werde mal isdigit Testen !
    Danke fuer den Hinweis.

    mfg Oliver Kern.



  • daa531 schrieb:

    Wäre es nicht einfacher abzufragen ob atoi(save_clipoi)>-1 und atoi(save_clipoi)<16 ist???

    Nein das geht nicht !
    Wenn Buchstaben im String enthalten sind, bringt mir atoi falsche Werte !

    Du fragst doch eh vorher ab, ob Buchstaben drin sind! => if (isalpha(*save_clipoi)) //bei der ersten Stelle
    Für die zweite Stelle kannst du ja dann isalpha(save_clipoi[1]) verwenden und wenn du das ganze variable halten willst, dann frag alle Stellen in einer Schleife ab, ob ein Buchstabe drin ist. Wobei es besser wäre, wenn du abfragen würdest, ob eine Ziffer drinsteht, wie Shade schon schrieb. Was ist nämlich, wenn der Benutzer aufeinmal auf die Idee kommt und ein % oder ein anderes Sonderzeichen eingibt?


Anmelden zum Antworten