Concat LPSTR в C - PullRequest
       32

Concat LPSTR в C

0 голосов
/ 20 ноября 2011

Попытка использовать в качестве базового C, насколько я могу, чтобы построить список чисел от 1 до 52 в случайном порядке (колода карт). Все работает, но все мои попытки соединить строки и получить результат заканчиваются неудачей. Какие-либо предложения? ПРИМЕЧАНИЕ: это не домашняя работа, это то, что я использую для создания игры.

// Locals
    char result[200] = "";  // Result
    int card[52];           // Array of cards
    srand(time(0));         // Initialize seed "randomly"

    // Build
    for (int i=0; i<52; i++) {
        card[i] = i;  // fill the array in order
    }

    // Shuffle cards
    for (int i=0; i<(52-1); i++) {
        int r = i + (rand() % (52-i));
        int temp = card[i]; card[i] = card[r]; card[r] = temp;
    }

    // Build result
    for (int c=0; c<52; c++) {

        // Build
        sprintf(result, "%s%d", result, card[c]);

        // Comma?
        if ( c < 51 )
        {
            sprintf(result, "%s%s", result, ",");
        }
    }

Мой конечный результат всегда искаженный текст. Спасибо за помощь.

Ответы [ 4 ]

4 голосов
/ 20 ноября 2011

Вы продолжаете писать в одну и ту же позицию "результата".

sprintf не собирается выполнять добавление за вас.

Вы можете рассмотреть, после каждого sprintf,получить возвращаемое значение (которое является числом записанных символов) и увеличить указатель на буфер результатов.то есть что-то вроде:

(код псевдо):

char result[200];
char * outputPtr = result;

for (int c=0; c<52; c++) {

    // Build
    int n = sprintf(outputPtr, "%d%s", card[c], (c<51 ? "," : ""));
    outputPtr += n;
}
1 голос
/ 20 ноября 2011

Мы пишем C ++ или C?В C ++ конкатенация строки просто:

string_out = string_a + string_b

… так как вы будете использовать std::string.

Более того, если это C ++, STL имеет std::shuffle function.

Если это C, учтите, что все ваши sprintf не являются конкатенационными строками, они просто перезаписывают старое значение.

0 голосов
/ 20 ноября 2011

Я думаю, что если память будет служить, то sprintf всегда будет писать в буфер, начиная с байта 0. Это означает, что вы будете записывать первые пару байтов снова и снова числом, затем запятой, затем числом , Проверьте, являются ли ваши первые байты ", [0-9]" - если так, то это ваша проблема.

0 голосов
/ 20 ноября 2011

Это добавит запятую между каждым числом в строке результата:

 // Get a pointer to the result string
 char* ptr = &result[0];
 for (int c = 0; c < 52; c++) {

    // Add each cards number and increment the pointer to next position
    ptr += sprintf(ptr, "%d", card[c]);

    // Add a separator between each number
    if (c < 51) {
        *ptr++ = ',';
    }
}
// Make sure the result string is null-terminated
*ptr = 0;
...