3

私はCを初めて使用し、文字列に問題があります。私がやりたいのは、ループ内に「val1、val2、val3」のような文字列を作成することです。

現在、私のコードは次のようになっています。

char tagstr[60] = "";
int k;
int n = 5;
for (k=0; k < n; k++) {
    char temp[10]  = "";
    sprintf(temp, ", val%d", k);
    strcat(tagstr, temp);
}

ただし、tagstrの出力は "、val#"です。ここで、#は長整数値です。ここでポインタに何か問題があると思いますが、考えられることはすべて試しましたが、成功しませんでした...助けていただければ幸いです。

編集:それが役立つ場合は、より多くのコンテキスト:

int tagsClosed = strlen(pch1) - strcspn(pch1, ")");
do {
    if (curTag.size > 0) {
        // problem section
        char tagstr[60] = "";
        int k;
        for (k = 0; k < 5; k++) {
            char temp[10] = "";
            sprintf(temp, ", val%i", temp, k);
            strcat(tagstr, temp);
        }

        // This prints out something like ", val-890132840" x 5 (same number)
        printf ("String is now: %s\n", tagstr);
    }
    curTag = *(curTag.parent);
    tagsClosed--;
} while (tagsClosed > 0);

curTagは構造体です:

typedef struct Tag {
    char * name;
    int size; // number of children
    int tagnum;
    struct Tag* parent;
} Tag;
4

5 に答える 5

9

問題はsprintf(temp, ", val%i", temp, k);、の値temp(実際には配列の最初の文字のアドレス)を文字列に追加し、の値を文字列にまったく追加しないことkです。これはである必要がありますsprintf(temp, ", val%i", k);

必要なスペースの量を事前に計算できます(ゼロターミネータを含む)。

5+1 + 5+1 + 5+1 + 5+1 + 5+1 + 1 = 31 characters

また; の終わりを繰り返し検索してから、新しい文字を最後にコピーするため、使用strcatは(パフォーマンスの点で)良くありません。tagstr現在の終わりを追跡しtagstr、検索、一時的な文字列、コピーを行わずに、次の文字グループを最後に直接保存することをお勧めします。例えば:

void thing(void) {
    char tagstr[60];
    int pos = 0;
    int k;
    int n = 5;

    for (k=0; k < n; k++) {
        pos += sprintf(&tagstr[pos], ", val%d", k);
    }
    printf ("String is now: %s\n", tagstr);
}
于 2012-11-01T01:40:19.557 に答える
3

私のために働く:

$ gcc -xc - && ./a.out
int main(void) {
        char tagstr[60] = "";
        int k;
        int n = 5;
        for (k=0; k < n; k++) {
            char temp[10]  = "";
            sprintf(temp, ", val%d", k);
            strcat(tagstr, temp);
        }
        printf("[%s]\n", tagstr);
}
[, val0, val1, val2, val3, val4]

あなたが問題が最初の", "..にあると言っていない限り

于 2012-11-01T01:12:08.530 に答える
2

一時配列が短すぎます!使用する

char temp[16];
于 2012-11-01T01:04:38.980 に答える
2

先頭のコンマと空白が不要な場合は、表示したコードの単純なバリエーションを使用できます。

#include <stdio.h>
#include <string.h>

int main(void)
{
    char tagstr[60] = "";
    const char *pad = "";
    int k;
    int n = 5;
    for (k = 0; k < n; k++)
    {
        char temp[10]  = "";
        snprintf(temp, sizeof(temp), "%sval%d", pad, k);
        strcat(tagstr, temp);
        pad = ", ";
    }
    printf("tagstr <<%s>>\n", tagstr);
    return 0;
}

プログラムからの出力は次のとおりです。

tagstr <<val0, val1, val2, val3, val4>>

ただし、先頭のコンマと空白を使用しても、コードは正しく機能します。

于 2012-11-01T01:21:44.883 に答える
0

tempの結果を保持するのに十分な長さではありませんsprintf。これがまさに、可能な場合はいつでも、サイズパラメータをとる文字列関数の他のバリアントをsnprintf使用する必要がある理由です。strncat

于 2012-11-01T01:02:21.457 に答える