2012-06-25 2 views
-2

Я пытаюсь добавить некоторую функциональность в dunst, небольшую систему уведомлений. Я действительно никогда не делал ничего в C, но мне удалось сделать в основном то, что я хочу в небольшом файле:Объединить строки в 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 со строками:/

Как мне сделать это правильно? Если я смогу это получить, я думаю, что смогу получить изменения, которые хочу работать.

Не стесняйтесь укоротить код, я не знаю, что мне действительно нужно, чтобы удержать и что можно удалить, если мне нужна помощь.

ответ

2

Не прочитал ваш код, но для меня это действительно звучит как sprint.

int sprintf (char * str, const char * format, ...); в основном принтf для струнные. Возьмем операторы формата и выбросим все вместе на str.

Documentation

1

не совсем уверен, что вы пытаетесь сделать, но от того, что я могу сказать, вы просите

Sprintf ..... так же, как Printf, за исключением первых вы указать, какую строку вы хотите, чтобы результат идти в

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

+0

Я попробую, это имеет смысл. Я пытался использовать его, но не в том месте, где я думаю. – Rob

+0

Я не думаю, что могу просто отбросить sprintf в вызов функции вроде этого:/ – Rob

+1

Получил его на работу, заменив код соответствующим кодом и тем, что я сделал, чтобы исправить его. – Rob

2

Обратите внимание, что snprintf() следует использовать вместо Sprintf() (это важно, чтобы установить размер буфера для защиты от переполнения).

Идеально выделять буфер, основанный на длине обеих исходных строк, а затем использовать формат, который их объединяет; например snprintf (буфер, длина, "% s% s", str1, str2).

Обязательно проверьте возвращаемое значение при вызове snprintf() или любой аналогичной функции.

Смежные вопросы