Giả sử bạn có thẻ [fixed_size] như được đăng, chứ không phải char *, bạn có thể sử dụng macro đơn lẻ, sáng tạo để thực hiện tất cả cùng một lúc với lệnh đặt cout thay vì định dạng kiểu printf rời rạc.Nếu bạn đang làm việc với các hệ thống nhúng, phương pháp này sẽ cho phép bạn thoát khỏi nhóm các chức năng lớn như snprintf()
(Điều này cũng ngăn không cho ăn kiêng) và thậm chí không yêu cầu malloc()
hoặc bất kỳ chức năng nào từ <string.h>
.
#include <unistd.h> //for write
//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[100];
int len=0;
strcpyALL(buf,len, argv[0],": ", cmd_argv[0],": ",cmd_argv[1]);
if (len==sizeof(buf))write(2,"error\n",6);
else write(1,buf,len);
- Note 1, bạn có thể sử dụng bất kỳ chức năng mà kết quả đầu ra một char *, bao gồm các chức năng chuẩn như itoa() để chuyển đổi số nguyên với các loại chuỗi.
- Lưu ý 2, nếu bạn đang sử dụng thư viện dùng chung hoặc đang sử dụng chức năng kiểu printf ở bất kỳ đâu trong chương trình được xây dựng tĩnh, lý do duy nhất không sử dụng snprintf() (vì mã được biên dịch sẽ lớn hơn với phương thức này) là vì nó được gạch chân và không gọi bất kỳ chức năng bên ngoài nào, vì vậy nó phải tương đối nhanh.
bạn có thể sử dụng dấu vân tay ... – forsvarir
Đây là trường hợp của [Shlemiel the Painter] (http://en.wikipedia.org/wiki/Schlemiel_the_Painter%27s_algorithm). –
Cẩn thận với '_snprintf' của Microsoft không đảm bảo kết thúc null của bộ đệm đích. –