【发布时间】:2014-11-05 21:08:38
【问题描述】:
以下代码由于某种原因崩溃,产生以下消息“进程返回 -1073741819 (0xC0000005)”。调试器说这一行存在分段错误:
printf("|%s|", grid[a][b]);
但是,我认为这不是真正的错误,这意味着之前一定会出错。由于我对 C 中的字符串和数组不是很有经验,请你看看我的代码,看看你是否能找到错误。
#include <stdio.h>
#include <stdlib.h>
#define VALUES1 3
#define VALUES2 3
#define NAMELEN 10
void printgrid(char grid[VALUES1][VALUES2]);
void play(char grid[VALUES1][VALUES2], char player);
int game(void);
int main() {
return game();
}
int game() {
char grid[VALUES1][VALUES2], player, turn, names[2][NAMELEN];
int a, b;
for (a = 0; a < 2; ++a){
printf("Please enter the name of player number %d\n", a + 1);
scanf("%s", names[a]);
}
for (a = 0; a < VALUES1; ++a){
for (b = 0; b < VALUES2; ++b){
grid[a][b] = ' ';
}
}
for (turn = 9; turn > 0; --turn){
if (turn % 2 == 1){
player = names[0];
}
else {
player = names[1];
}
play(grid, player);
printf("\n");
printgrid(grid);
printf("\n");
}
return 0;
}
void printgrid(char grid[VALUES1][VALUES2]) {
int a, b;
for (a = 0; a < VALUES1; ++a) {
for (b = 0; b < VALUES2; ++b) {
printf("|%s|", grid[a][b]);
}
printf("\n");
}
}
void play(char grid[VALUES1][VALUES2], char player) {
int row, column;
printf("Enter the row number:\n");
scanf("%d", &row);
printf("Enter the column number:\n");
scanf("%d", &column);
--row;
--column;
grid[row][column] = player;
}
编辑: 使用 %c 输出
|þ||þ||þ|
|±||±||þ|
|±||±||þ|
【问题讨论】:
-
grid[a][b]是char,而不是字符串,因此您应该在printf中使用%c格式(或使用putchar)。你的编译器可以告诉你,如果你通过启用所有警告来指示它。 -
正如@MOehm 所说,
%s将需要一个字符数组。你传递给它一个字符文字。因此 printf 正在向前读取内存以寻找空终止符。因此,为什么会出现分段错误。几乎任何时候一个函数向前读入不是它自己的内存,程序就会崩溃。%c是您所需要的。 -
请edit您的问题标题更具体。 “C 程序崩溃”没有具体说明您遇到的问题,如果它出现在该站点的未来用户的搜索中,它将完全没有意义。对于您的汽车维修人员来说,这并不比“我的车坏了”更有意义。
-
谢谢!首先,我想打印一个字符串而不仅仅是一个字符。我应该如何改变我的代码来实现这一点?其次, %c 不会使程序崩溃,但播放的角色始终相同。我想要代码在他们玩完广场后将名字打印到广场上!
标签: c arrays string multidimensional-array