wie konvertiert ein integer zu string?
Ich habe einen standard-c-Funktion mit dem folgenden Prototyp
extern void lcd_puts(const char *s);
in meiner anderen Funktion habe ich so etwas
send_to_lcd() {
uint8_t count = 10
lcd_puts(count);
}
meine Frage ist wie kann ich umwandeln zählen, um ein string-pointer in der Lage sein, um es zu senden lcd_puts
das sollte drucken Sie die Zählung auf lcd-Bildschirm
Dank
Wissen Sie, welche Bibliotheken Sie zur Verfügung haben? Sie haben
itoa
oder sprintf
?InformationsquelleAutor w_hoami | 2011-09-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
sprintf formatiert einen string
Kurzes Beispiel:
InformationsquelleAutor jyore
Auf einem mikrocontroller, die Sie haben, zumindest ein wenig besorgt über die Leistung (die Regeln aus
sprintf
), auch die Teilung ist eine sehr teure operation, die auf solchen chips. Sie wollen also optimierten code für einen mikrocontroller.Ich geschrieben habe, einige hier: http://ideone.com/SsEUW (müssen ein paar änderungen für die Verwendung mit C-style-strings statt C++, aber die Methode sollte klar sein)
vorgeschlagen von Owen könnte machbar sein, aber
sprintf
ist ein schrecklich Wahl auf einen mikrocontroller.Bis die OP fügt die Worte "ich muss es schnell gehen", um seine/Ihre Frage, ich bleibe mit meiner Antwort, dass
sprintf
ist die beste Wahl hier; es ist ein weithin unterstützten standard-library-Funktion (man kann nicht sagen das gleiche füritoa
).Ja, wahrscheinlich
sprint
wäre in Ordnung, wenn er schreibt, einem LCD-Bildschirm, es ist nicht so, du wirst sehen, das 1 ms (1000 Zyklen auf 1MHz proc) oder so Verzögerung. Seien Sie vorsichtig mit ihm, obwohl, weil eine Menge von eingebetteten Bibliotheken verwenden eine abgespeckte, nicht-standard-sprintf, die vielleicht nicht das tun, was Sie erwarten (wie immer-print in Hex (PIC für %ld)), oder gar keineEr ist auf der Suche nach einem C beantworten.
InformationsquelleAutor Ben Voigt
Es hängt davon ab, was
lcd_puts
hat mit seinem argument. Eine Möglichkeit ist wie folgt:Aber denken Sie daran, dass
str
geht out of scope, sobaldsend_to_lcd()
gibt. Also, wennlcd_puts
"erinnert" sich an seine input-argument, hat dies ein Undefiniertes Verhalten.Wenn das der Fall ist, müssen Sie
malloc
einen string-Puffer statt. Aber dann müssen Sie daran denken, zufree()
es irgendwann, und es wird alles ziemlich chaotisch.malloc()
könnten Sie einstatic
- Puffer (aber ich glaube nicht, dasslcd_puts
speichert es das argument-es ist wohl nur die Einstellung der digitalen pins).Ja, vermutlich nicht. Ich war nur die Vorbereitung für den worst-case, wo das LCD nicht tatsächlich aktualisiert, bis später oder so.
Als Graf ist im Grunde eine kleine Ganzzahl ohne Vorzeichen, %s als format in sprintf ist wahrscheinlich Zugriff auf verletzen.
Guter Fang, vielen Dank!
Für mikrocontroller-Projekte, die ich vermeiden malloc.
InformationsquelleAutor Oliver Charlesworth
Dies scheint ein sinnvoller Ansatz.
printf
überhaupt?Die printf () tritt in die unit-test, nicht die Funktion. Die Frage war nach einer Methode, um aus einem uint8_t in einen char *. Der Funktion tut das, ohne dafür den Aufwand das verbunden wäre mit der printf-Familie.
umbenannt-Funktion, um auf seine Absicht.
Die Funktion u82s() geschrieben ist, ist nicht reentrant, da es verwendet eine statische Zeichenfolge. Vielleicht ein besseres design würde die Zeichenfolge als argument. So, die Funktion konnte-format die Zahl in jedem Ort, der eine längere Zeichenfolge. (Aber dann sollte es nicht schreiben, '\0' am Ende). Ich bin nicht einverstanden mit dem vorherigen Kommentar, dass diese Funktion langsam ist. In der Tat, es ist vielleicht eine Größenordnung schneller als snprintf() oder ähnlichen Funktionen. Es ist auch um Größenordnungen kleiner code-Größe.
tut mir Leid, mein inexpertise mit c, aber Fragen Sie sich, Wann genau ist das u82s () - Funktion wird aufgerufen?
InformationsquelleAutor EvilTeach
Einnahme Ihrer api als Grundlage.
Es ist im Grunde das gleiche wie die Antwort, die Sie gepflückt. Konvertieren Sie den Wert count in ein c-string, so dass lcd_puts es verwenden können.
InformationsquelleAutor EvilTeach
Entfernt statische und aufgeräumt:
Ich kann nicht drucken über 32767, aber ich denke, dass das etwas zu tun mit meinem compiler-Optionen.
InformationsquelleAutor user1675013