尝试使用基本C作为基本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, ",");
}
}
我的最终结果总是乱码。谢谢你的帮助。
答案 0 :(得分:4)
你一直在写“结果”的相同位置。
sprintf
不会为你做补充。
在每个sprintf
之后,您可以考虑获取返回值(写入的char数),并将指针递增到结果缓冲区。例如:
(伪代码):
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 :(得分:1)
我们是在写C ++还是C?在C ++中,连接字符串只是:
string_out = string_a + string_b
...因为你正在使用std::string
。
此外,如果这是C ++,则STL具有std::shuffle
函数。
如果这是C,请注意你的所有sprintf
都没有连接字符串,它们只是覆盖旧值。
答案 2 :(得分:0)
这会在结果字符串中的每个数字之间添加逗号:
// 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;
答案 3 :(得分:0)
我认为,如果内存服务,sprintf将始终从字节0开始写入缓冲区。这意味着你将用数字反复写入前几个字节,然后是逗号,然后是数字。检查你的第一个字节是否是“,[0-9]” - 如果是,那就是你的问题。