-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);
}

これは、私が推測していることからコンマ演算子として使用しています.%sを文字列に置き換えるために、printfのように使用したいと思います:/

これを適切に行うにはどうすればよいですか?それを手に入れることができれば、働きたい変化を手に入れることができると思います。

コードを短くしてください。本当に保持する必要があるものと、これについて助けが必要な場合は削除してもよいものがわからない.

4

3 に答える 3

2

あなたのコードを実際に読んだわけではありませんが、間違いなくsprint私のように聞こえました。

int sprintf ( char * str, const char * format, ... );基本的に文字列のprintf。フォーマット演算子を取り、それをすべて一緒に str にスローします。

ドキュメンテーション

于 2012-06-25T02:49:11.067 に答える
2

sprintf() の代わりに snprintf() を使用する必要があることに注意してください (オーバーフローを防ぐためにバッファー サイズを設定することが重要です)。

理想的には、両方の元の文字列の長さに基づいてバッファーを割り当て、それらを組み合わせた形式を使用します。例: 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 に答える