C 为什么写这个程序会输出奇怪的字符串?
我正在尝试用C语言编写“扫雷者”代码。我首先将值赋给一个2D数组,然后将其打印出来。我什么都试过了,但没用 这发生在我的示例输出中: 代码是:C 为什么写这个程序会输出奇怪的字符串?,c,C,我正在尝试用C语言编写“扫雷者”代码。我首先将值赋给一个2D数组,然后将其打印出来。我什么都试过了,但没用 这发生在我的示例输出中: 代码是: #include <stdio.h> #include <stdlib.h> struct Tile { unsigned char isMine : 1; char status; }; int main() { struct Tile arr[9][9]; unsigned char i;
#include <stdio.h>
#include <stdlib.h>
struct Tile {
unsigned char isMine : 1;
char status;
};
int main() {
struct Tile arr[9][9];
unsigned char i;
unsigned char c;
unsigned char count = 10;
srand((unsigned)time(0));
for (i = 0; i < 9; i++) {
for (c = 0; i < 9; i++) {
if(rand() % 81 + 1 < count && arr[i][c].isMine == 0 && count > 0) {
arr[i][c].isMine = 1;
arr[i][c].status = 'X';
count--;
} else if (arr[i][c].isMine == 0) {
arr[i][c].status = '.';
}
}
if (count == 0) {
break;
} else {
continue;
}
}
for (i = 0; i < 9; i++) {
for (c = 0; c < 9; c++) {
printf("%c", arr[i][c].status);
}
printf("\n");
}
return 0;
}
#包括
#包括
结构砖{
无符号字符:1;
字符状态;
};
int main(){
结构瓦arr[9][9];
无符号字符i;
无符号字符c;
无符号字符数=10;
srand((未签名)时间(0));
对于(i=0;i<9;i++){
对于(c=0;i<9;i++){
如果(rand()%81+10){
arr[i][c].isMine=1;
arr[i][c]。状态='X';
计数--;
}else if(arr[i][c].isMine==0){
arr[i][c]。状态=';
}
}
如果(计数=0){
打破
}否则{
持续
}
}
对于(i=0;i<9;i++){
对于(c=0;c<9;c++){
printf(“%c”,arr[i][c]。状态);
}
printf(“\n”);
}
返回0;
}
请提供帮助。初始化阵列:
struct Tile arr[9][9] = {{0}};
否则,您将在以下位置读取未初始化的值(导致未定义的行为):
由于循环标题不正确,您从未访问循环中除第1列以外的任何字段: (i=0;i<9;i++)的
{
对于(c=0;i<9;i++){
如果(rand()%81+10){
arr[i][c].isMine=1;
arr[i][c]。状态='X';
计数--;
}else if(arr[i][c].isMine==0){
arr[i][c]。状态=';
}
}
如果(计数=0){
打破
}否则{
持续
}
}
这将使所有其他字段未初始化,当您尝试打印它时,可能会出现奇怪的情况
此外,由于每个字段只访问一次(或者至少这似乎是您的意图),因此根本不需要检查isMine
。如果正确初始化,则它必须为0
这当然需要你像大卫的回答中提到的那样适当地初始化
在第一部分(。+10
)中,该条件可以稍微降低。无需再次检查
最后,继续
,因为循环的最后一条指令并不是真正有用的
您的代码可能如下所示:
struct Tile arr[9][9]={{0};;
...
对于(i=0;i<9;i++){
对于(c=0;c<9;c++){
如果(rand()%81+1
这个循环看起来很可疑:for(c=0;i<9;i++)
c
永远不会更改。为什么要选中.isMine==0
呢?无论如何,每个单元格只访问一次。@Gerhard Damn我在编写代码时需要更加小心。谢谢。如果这些是字符串,那么覆盖空终止符也不是一个好主意。我试图做的事情是如果它没有生成足够的数据(比如如果它生成7个地雷)我希望它继续循环,直到计数变为“0”,如果(计数==0){break;}我尝试了如果(I==8){I=0;}但是一个无限循环发生了。我又错过了什么我想知道…那不是将会发生的事。继续
只是开始当前循环的下一个迭代。也就是说,外循环将继续下一个迭代。它不会重复当前迭代。我想你只会得到你想要的地雷的一半。你不应该与 } else if (arr[i][c].isMine == 0) {
arr[i][c].status = '.';
}