Ist im String eine Zahl ?
-
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???
-
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?