我在visual studio 2012 RC中编写了一个简单的代码,要求用户插入二维数组的值。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ROW 5
#define COL 3
int main()
{
char array[ROW][COL];
int value;
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
scanf("%d", &value);
array[i][j] = value;
// scanf("%d", &array[i][j]); //use this statement instead of above 2 statements.
}
printf("\n");
}
问题是上面的代码工作正常;但是,如果我使用(如评论部分所述)
scanf("%d", &array[i][j])
直接,不是将输入存储到变量中然后将其分配给数组,程序将给出“堆栈内存'数组'已损坏'之类的错误。
有人可以告诉我为什么我遇到这个问题,如何在将输入直接存储到数组中时避免使用它,而不是先将输入存储在变量中。
ps-这是我的第一篇文章,所以要温柔:)
答案 0 :(得分:1)
您试图将int
(%d
)放入char
(char array[ROW][COL]
),因此存在内存违规行为。
答案 1 :(得分:0)
声明你应该声明的数组:
int array[ROW][COL];
这将解决您的问题。 %d格式说明符期望传递指向int的指针,并将指针传递给char。您的数组很小,以适合您尝试使用scanf放置的值。
答案 2 :(得分:0)
@light:
顺便说一句,我调整了程序,结果发现如果我使用int数组,就没有问题了。不过,我想知道为什么char数组会出错?
如果您想使用char
数组,可以使用以下内容。
目前我只能访问gcc,但是 在玩你的代码时,我发现了以下内容:
#define ROW 2 // note that I defined a 2x2 matrix
#define COL 2
....
char array[ROW][COL];
....
scanf("%c", &array[i][j]);
....
我使用以下行打印结果:
printf("\n");
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
printf("%c ", array[i][j]);
}
printf("\n");
}
如果我想将以下四个值作为输入1 2 3 4
,我会注意以下几点:
$./a.out
1
2 # input breaks here and the following lines are printed....
1
2
但是,如果我使用以下行
do {scanf("%c",&array[i][j]);} while ( getchar() != '\n' );
代码而不是
scanf("%d", &array[i][j]);
在您的两个for
循环中,它似乎按预期工作。
示例输入和输出(数字实际上是字符):
$./a.out
1
2
3
4
1 2 #output
3 4
当然它适用于信件:
$./a.out
a
b
c
d
a b #output
c d