-2

我正在尝试向小通知系统 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->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 :/

我怎样才能让它正确地做到这一点?如果我能得到它,我想我可以得到我想要工作的改变。

随意缩短代码,我不知道我真正需要保留什么以及如果我需要一些帮助可以删除什么。

4

3 回答 3

2

没有真正阅读您的代码,但对我来说确实听起来很像sprint

int sprintf ( char * str, const char * format, ... );基本上 printf 用于字符串。将采用格式运算符并将其全部放入 str 中。

文档

于 2012-06-25T02:49:11.067 回答
2

请注意,应该使用 snprintf() 而不是 sprintf() (设置缓冲区大小以防止溢出很重要)。

理想情况下,根据两个原始字符串的长度分配一个缓冲区,然后使用组合它们的格式;例如 snprintf(buffer, length, "%s%s", str1, str2)。

调用 snprintf() 或任何类似函数时,请务必检查返回值。

于 2012-06-25T03:00:51.187 回答
1

不太确定您要做什么,但是据我所知,您要的是

sprintf.....就像printf一样,除了首先你指定你希望结果进入什么字符串

sprintf(s, "%s %s", str1, str2);

于 2012-06-25T02:49:27.697 回答