Angenommen, Sie haben ein char[fixed_size] anstelle eines char*, können Sie ein einziges, kreatives Makro verwenden, um alles auf einmal mit einem <<cout<<like
Bestellung ("lieber %s die unzusammenhängende %s \n ", "als", "printf style format"). Wenn Sie mit eingebetteten Systemen arbeiten, können Sie mit dieser Methode auch auf malloc und die großen *printf
Familie von Funktionen wie snprintf()
(Dies verhindert, dass dietlibc sich auch über *printf beschwert)
#include <unistd.h> //for the write example
//note: you should check if offset==sizeof(buf) after use
#define strcpyALL(buf, offset, ...) do{ \
char *bp=(char*)(buf+offset); /*so we can add to the end of a string*/ \
const char *s, \
*a[] = { __VA_ARGS__,NULL}, \
**ss=a; \
while((s=*ss++)) \
while((*s)&&(++offset<(int)sizeof(buf))) \
*bp++=*s++; \
if (offset!=sizeof(buf))*bp=0; \
}while(0)
char buf[256];
int len=0;
strcpyALL(buf,len,
"The config file is in:\n\t",getenv("HOME"),"/.config/",argv[0],"/config.rc\n"
);
if (len<sizeof(buf))
write(1,buf,len); //outputs our message to stdout
else
write(2,"error\n",6);
//but we can keep adding on because we kept track of the length
//this allows printf-like buffering to minimize number of syscalls to write
//set len back to 0 if you don't want this behavior
strcpyALL(buf,len,"Thanks for using ",argv[0],"!\n");
if (len<sizeof(buf))
write(1,buf,len); //outputs both messages
else
write(2,"error\n",6);
- Anmerkung 1: Normalerweise würde man argv[0] nicht so verwenden - dies ist nur ein Beispiel
- Anmerkung 2: Sie können jede Funktion verwenden, die ein char* ausgibt, einschließlich nicht standardisierter Funktionen wie itoa() zur Umwandlung von Ganzzahlen in Zeichenketten.
- Anmerkung 3: Wenn Sie bereits printf irgendwo in Ihrem Programm verwenden, gibt es keinen Grund, snprintf() nicht zu verwenden, da der kompilierte Code größer (aber inlined und wesentlich schneller) wäre.