Problem bei Variablenlänge bei sscanf
-
@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.
-
@Peter-Viehweger sagte in Problem bei Variablenlänge bei sscanf:
maßgeschneiderten
lol
char const* str2ui(char const *str, unsigned *result) { *result = 0; for (; '0' <= *str && *str <= '9'; ++str) { // nein, eigentlich isdigit()! *result *= 10; *result += *str - '0'; } return str; }
@Jackson00 Nein, nicht machen! Verwende die Standard Library immer wenn möglich!
(Zum Üben rumspielen ist ein anderes Thema.)
-
@Peter-Viehweger sagte in Problem bei Variablenlänge bei sscanf:
Das ist wie mit dem maßgeschneiderten Anzug: Es passt genau!
Zumindest hast du Humor.
-
@Peter-Viehweger sagte in Problem bei Variablenlänge bei sscanf:
Ich programmiere solche Funktionen irgendwie gerne selbst. Das ist wie mit dem maßgeschneiderten Anzug: Es passt genau!
Du nähst deine Anzüge selbst? Respekt!
-
Nein, aber wenn ich nicht weiß, dass es bereits eine Standardfunktion gibt, was ja mal vorkommen kann, dann bin ich in der Lage, das Problem durch Implementieren einer eigenen Funktion zu lösen. Manchmal ist das der Unterschied zwischen "Funktioniert!" und"Funktioniert nicht!".
-
@Peter-Viehweger sagte in Problem bei Variablenlänge bei sscanf:
Manchmal ist das der Unterschied zwischen "Funktioniert!" und"Funktioniert nicht!".
'tschuldige, aber was Du da oben gezeigt hast ist Müll.
-
-
@hustbaer Sag' mal weinst Du etwa oder ist es der Regen, der von deiner Nasenspitze tropft?
-
@Swordfish Das ist das Jesus-Baby das weint.