Problem bei Variablenlänge bei sscanf
-
Dieser Beitrag wurde gelöscht!
-
Wenn ich das jetzt richtig verstanden habe kann C89 das nicht sondern erst c99 und es gibt keine Möglichkeit unter dieser Version mit sscanf eine Zahl als char aus einem String zu extrahieren. Nur als int.
Der String könnte leider auch Übertragungsfehler haben deswegen wäre atoi nicht die Wahl.
Dann wäre wirklich die einzige Möglichkeit sscanf mit temporären Int-Varialblen auszulesen und dann später in die eigentlichen char Variablen zu schreiben, richtig?
-
@Jackson00 sagte in Problem bei Variablenlänge bei sscanf:
Dann wäre wirklich die einzige Möglichkeit
sscanf()
mit temporären int-Varialblen auszulesen und dann später in die eigentlichen char Variablen zu schreiben, richtig?Ja. Die beiden
int
egers sind sowieso Funktionslokal auf dem Stack und wieder weg sobald der Scope verlassen wird. Wie gesagt, wird Dich nicht umbringen.
-
Das mit den int wäre auch sicherer, da %hhu UB ist, falls du doch mal probierst, Werte >255 damit einzulesen (bei CHAR_BIT=8).
-
Würde dann so in etwa aussehen?
unsigned short tmp1, tmp2; if (2 == sscanf(Command, "%3d,%3d", &tmp1, &tmp2)) { Level[0] = (*(char *) &tmp1); Level[1] = (*(char *) &tmp2); }
-
@Jackson00
Oh Gott, hilf - natürlich nicht so.unsigned tmp1, tmp2; if (2 == sscanf(Command, "%u,%u", &tmp1, &tmp2)) { Level[0] = (unsigned char)tmp1; Level[1] = (unsigned char)tmp2; }
evtl. noch testen, ob tmp >255 ist.
-
@Jackson00 sagte in Problem bei Variablenlänge bei sscanf:
Würde dann so in etwa aussehen?
Nein!
%d ist für int
%hd ist für short
%hu ist für unsigned short
-
int ist bei meinem MC(16Bit MC)/Compilter 16Bit also gleich ob short oder int
-
@Jackson00 sagte in Problem bei Variablenlänge bei sscanf:
*(char *)
Wie kommst Du auf solche Ideen??
@Jackson00 sagte in Problem bei Variablenlänge bei sscanf:
also gleich ob
short
oderint
Ja, und irgendwann soll der Code woanders laufen und ... *boooom*. Gleich richtig machen kostet nichts extra.
-
@Jackson00 darum ist C nicht (so sehr) für Anfänger geeignet.
Mittlerweile können die Compiler an der Stelle auch warnen.
-
@Jackson00 sagte in Problem bei Variablenlänge bei sscanf:
int ist bei meinem MC(16Bit MC)/Compilter 16Bit also gleich ob short oder int
Das spielt keine Rolle.
Anderer MC oder Compiler und schon hast du Probleme,Mach es gleich richtig.
Ein Programm kann auch auf maximaler Warnstufe ohne Warnungen compilieren.
-
KA (*(char
hatte ich irgendwo im Netz beim suchen gefunden
Normalerweise reichen für den MC und das was ich damit programmiere die rudimentären C-Befehle völlig, die Lib String ist die einzigste C-Lib die ich eingebunden habe. Und auch nur weil ich nicht wusste wie ich sonst Zahlen aus Strings extrahiere und ich auch noch ein paar andere Befehle wie strcpy , strcat, etc. für die Stingmanipulation benutze.Wie man sieht habe ich nicht wirklich gute C Kenntnisse...
@Wutz sagte in Problem bei Variablenlänge bei sscanf:
Also dann so:unsigned tmp1, tmp2;
if (2 == sscanf(Command, "%hu,%hu", &tmp1, &tmp2)) {
Level[0] = (unsigned char)tmp1;
Level[1] = (unsigned char)tmp2;
}
-
-
die Zahl hinter dem % ist doch die max. Länge oder? Würde dann auch %3hu gehen? Dann könnte er theoretisch nur bis max. 999 lesen richtig?
-
Ja. Aber lass das
h
bleiben und nimmunsigned int
für die Argumente.int
(mit oder ohneunsigned
) ist in der Regel so breit wie ein Maschinenwort.
-
da hat der Editor irgendwas gefressen, ich habe bei mir unsigned short tmp1, tmp2; im Code stehen...
-
@Jackson00 Wenn auf deinem µC ein
int
16 bit breit ist, ist es einshort
auch. Schreib einfach einfachen Code ^^.#define false 0 #define true 1 typedef int bool; bool is_in_range(int value, int lower_bound, int upper_bound) { return lower_bound <= value && value <= upper_bound); } bool foo(char const *command, char unsigned *levels) { int tmp1; int tmp2; if (sscanf(command, "%d,%d", &tmp1, &tmp2) != 2 || !is_in_range(tmp1, 0x00, 0xff) || !is_in_range(tmp2, 0x00, 0xff)) { // handle error, perhaps return an error code: return false; } // everything allright, go on: levels[0] = (char unsigned) tmp1; levels[1] = (char unsigned) tmp2; // ... return true; } // ... if (!foo(command, levels)) { // handle error }
Eigentlich würde ich gerne mal das komplette Programm sehen.
Premature Optimization is the root of all evil.
-
@Jackson00 sagte in Problem bei Variablenlänge bei sscanf:
weil ich nicht wusste wie ich sonst Zahlen aus Strings extrahiere und ich auch noch ein paar andere Befehle wie strcpy , strcat, etc. für die Stingmanipulation benutze.
void ExtractNumberFromString(char string[], int *number) { //calculate string length int length = 0; int i = 0; while(str[i]) { length++; } //calculate number's highest power of ten int poweroften = 1; for(i = 0; i < length - 1; i++) { poweroften *= 10; } //extract number from string int number = 0; for(i = 0; i < length; i++) { number += (str[i] - '0') * poweroften; poweroften /= 10; } }
-
Warum nicht einfach
atoi
? Da ist die passende Behandlung von nicht-Ziffern schon mit drin.Und wieso Rückgabetyp
void
?
Und wiesoint* number
als Out-Parameter?
Und wieso selber zählen stattstrlen
?
Und außerdem ist das Problem wohl mehrere Zahlen aus einem string zu lesen.
-
@DocShoe sagte in Problem bei Variablenlänge bei sscanf:
Warum nicht einfach
atoi
? Da ist die passende Behandlung von nicht-Ziffern schon mit drin.Kann (und sollte) man nachher auch nehmen.
Und wieso Rückgabetyp
void
?Ich war zu faul, nach unten zu scrollen, um am Ende der Funktion "return number;" zu schreiben. Sorry...
Und wieso
int* number
als Out-Parameter?Ehrlich gesagt verwende ich Rückgabewerte gerne für Fehlercodes. Da kann man ja von halten, was man will.
Und wieso selber zählen statt
strlen
?Ich programmiere solche Funktionen irgendwie gerne selbst. Das ist wie mit dem maßgeschneiderten Anzug: Es passt genau!
Und außerdem ist das Problem wohl mehrere Zahlen aus einem string zu lesen.
Also entweder die Dokumentation durchwühlen und dann die Standardfunktion nehmen, oder die Anzahl der Ziffern der jeweiligen Zahl ermitteln und dann die (angepasste) obige Funktion verwenden.