Ihr Problem kann also gelöst werden, indem Sie es tun sscanf(buf, "%" TOSTRING(MAX_LEN) "s", val);
Warum 2 Makros kaskadieren? Wäre ein TOSTRING nicht genug?
– feedc0de
5. Oktober 2017 um 12:52 Uhr
Siehe Antwort unten zur Double-Expansion-Stringifizierung. Der C/C++-Präprozessor ist schmutzig und hässlich und ich glaube, ohne einen Standard. Warum es also zwei statt einem braucht, kann ich nicht sagen, weil ich nicht recherchieren möchte.
– Dan
5. Oktober 2017 um 15:42 Uhr
@Daniel Brunner Ein einzelnes Makro fügt das Token selbst ein und ergibt buchstäblich "%" "MAX_LEN" "%" ein zweites Makro bewirkt das Token Wert geklebt werden, z. "16" weil die TOSTRING Makro macht den endgültigen Code äquivalent zu STRINGIFY(16).
– Tim Sylvester
2. Februar 2018 um 2:46 Uhr
@TimSylvester Ich wünschte, ich könnte dir diesen Kommentar wiederholen! 🙂
und halten Sie es synchron. (Das ist ein bisschen lästig, aber solange die Definitionen direkt nebeneinander stehen, werden Sie sich wahrscheinlich daran erinnern.)
In diesem speziellen Fall eigentlich nicht strncpy genügen?
strncpy(val, buf, MAX_LEN);
val[MAX_LEN] = '\0';
Wenn es wäre printfaber das wäre einfacher:
sprintf(buf, "%.*s", MAX_LEN, val);
Während einige der oben genannten “funktionieren”, würde ich persönlich empfehlen, nur eine einfache String-API anstelle des Drecks zu verwenden, der in libc enthalten ist. Es gibt eine Reihe portabler APIs, von denen einige auch für die einfache Integration in Ihr Projekt optimiert sind … und andere ustr haben einen geringen Platzbedarf und Unterstützung für Stack-Variablen.
Meine zwei Cent. In meinem Beispiel ist das zu generierende Format %16s%16s%d
#include <iostream>
#define MAX_LEN 16
#define AUX(x) #x
#define STRINGIFY(x) AUX(x)
int main() {
char buffer[] = "Hello World 25";
char val[MAX_LEN+1];
char val2[MAX_LEN+1];
int val3;
char format[] = "%" STRINGIFY(MAX_LEN) "s" "%" STRINGIFY(MAX_LEN) "s" "%d";
int result = sscanf(buffer, format, val, val2, &val3);
std::cout<< val << std::endl;
std::cout<< val2 << std::endl;
std::cout<< val3 << std::endl;
std::cout<<"Filled: " << result << " variables" << std::endl;
std::cout << "Format: " << format << std::endl;
}
Ausgabe
14179200cookie-checkKonvertieren Sie ein Präprozessor-Token in eine Zeichenfolgeyes
stackoverflow.com/questions/195975/…
– Ciro Santilli OurBigBook.com
5. Oktober 2015 um 13:43 Uhr
Mögliches Duplikat von C-Makros zum Erstellen von Zeichenfolgen
– Richard Stelling
6. Oktober 2015 um 10:33 Uhr