在C中组合字符串

时间:2012-06-25 02:45:49

标签: c

我正在尝试为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:/

如何正确完成?如果我能得到它,我想我可以得到我想要改变的工作。

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

3 个答案:

答案 0 :(得分:2)

没有真正读过您的代码,但它对我来说肯定听起来像sprint

int sprintf ( char * str, const char * format, ... );基本上是字符串的printf。将格式运算符并将它们全部放入str。

Documentation

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

不太确定你要做什么,但从我所知道的,你要求

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

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