我正在尝试为dunst添加一些功能,这是一个小型的通知系统。我从来没有在C中做过任何事情,但我确实设法在一个小文件中基本上做了我想做的事情:
#include<stdio.h>
#include<string.h>
main()
{
char str1[128];
char str2[128];
sprintf(str1,"Hello");
sprintf(str2,"world!");
printf("%s %s\n",str1,str2);
}
strcat改变了给定的第一个字符串,这不是我想要的。在程序中,它按给定的文本计算窗口的宽度,并且我想在通知消息(cur_msg-&gt; msg)上附加一些文本(隐藏)。
这是代码的样子:
#define MAX(a,b) ((a) > (b) ? (a) : (b))
void
drawmsg(void) {
int width, x, y, height, drawn_msg_count, i;
unsigned int len = list_len(msgqueue);
msg_queue_t *cur_msg = msgqueue;
char hidden[128];
int hidden_count = 0;
int hidden_color_idx = NORM;
dc->x = 0;
dc->y = 0;
dc->h = 0;
/* a height of 0 doesn't make sense, so we define it as 1 */
if(geometry.h == 0) {
geometry.h = 1;
}
height = MIN(geometry.h, len);
drawn_msg_count = height;
hidden_count = len - height;
hidden_count = indicate_hidden && hidden_count > 0 ? hidden_count : 0;
sprintf(hidden, "(%d more)", hidden_count);
if(hidden_count && !single_line)
height++;
if(geometry.mask & WidthValue) {
if(geometry.w == 0) {
width = 0;
for(i = 0; i < height; i++){
width = MAX(width, textw(dc, cur_msg->msg));
if(hidden_count && !single_line)
width = MAX(width, textw(dc,("%s %s",cur_msg->msg,hidden)));
cur_msg = cur_msg->next;
}
} else {
width = geometry.w;
}
} else {
width = scr.dim.w;
}
cur_msg = msgqueue;
if(geometry.mask & XNegative) {
x = (scr.dim.x + (scr.dim.w - width)) + geometry.x;
} else {
x = scr.dim.x + geometry.x;
}
if(geometry.mask & YNegative) {
y = (scr.dim.h + geometry.y) - height*font_h;
} else {
y = 0 + geometry.y;
}
resizedc(dc, width, height*font_h);
XResizeWindow(dc->dpy, win, width, height*font_h);
drawrect(dc, 0, 0, width, height*font_h, True, colors[NORM]->BG);
for(i = 0; i < drawn_msg_count; i++) {
if(cur_msg->start == 0)
cur_msg->start = now;
drawrect(dc, 0, dc->y, width, font_h, True, cur_msg->colors->BG);
if(hidden_count && single_line){
drawtext(dc, ("%s %s",cur_msg->msg,hidden), cur_msg->colors);
} else {
drawtext(dc, cur_msg->msg, cur_msg->colors);
}
dc->y += font_h;
hidden_color_idx = cur_msg->urgency;
cur_msg = cur_msg->next;
}
if(hidden_count && !single_line) {
drawrect(dc, 0, dc->y, width, font_h, True, colors[NORM]->BG);
drawtext(dc, hidden, colors[hidden_color_idx]);
dc->y += font_h;
}
XMoveWindow(dc->dpy, win, x, y);
mapdc(dc, win, width, height*font_h);
}
这是我从猜测中使用它作为逗号运算符,并且我想像printf一样使用它来用字符串替换%s:/
如何正确完成?如果我能得到它,我想我可以得到我想要改变的工作。
随意缩短代码,我不知道我真正需要保留什么,如果我需要一些帮助,可以删除。
答案 0 :(得分:2)
没有真正读过您的代码,但它对我来说肯定听起来像sprint
。
int sprintf ( char * str, const char * format, ... );
基本上是字符串的printf。将格式运算符并将它们全部放入str。
答案 1 :(得分:2)
请注意,应该使用snprintf()而不是sprintf()(设置缓冲区大小以防止溢出很重要。)
理想情况下,根据两个原始字符串的长度分配缓冲区,然后使用组合它们的格式;例如snprintf(缓冲区,长度,“%s%s”,str1,str2)。
请务必在调用snprintf()或任何类似函数时检查返回值。
答案 2 :(得分:1)
不太确定你要做什么,但从我所知道的,你要求
sprintf .....就像printf一样,除非你首先指定你希望结果进入的字符串
sprintf(s, "%s %s", str1, str2);