Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将用户输入存储到数组中_C_Arrays - Fatal编程技术网

C 将用户输入存储到数组中

C 将用户输入存储到数组中,c,arrays,C,Arrays,我正在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

我正在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");
    }
直接地,程序不会将输入存储到变量中,然后将其分配给数组,而是会给出类似“数组周围的堆栈内存已损坏”的错误

有人能告诉我为什么会出现这个问题,以及如何在将输入直接存储到数组中而不是先将输入存储在变量中时避免这个问题


ps-这是我的第一篇帖子,所以请温和一点:)

你试图把
int
%d
)放进
char
char array[ROW][COL]
),因此内存冲突。

你试图把
int
%d
)放进
char code>(
char array[ROW][COL code>)中,因此存在内存冲突。

按应声明的方式声明数组:

int array[ROW][COL];

这将解决您的问题d格式说明符要求传递指向int的指针,而您传递指向char的指针。您的数组太小,无法容纳您尝试使用scanf放入其中的值。

按应声明的方式声明您的数组:

int array[ROW][COL];
这将解决您的问题d格式说明符要求传递指向int的指针,而您传递指向char的指针。您的数组太小,不适合您尝试使用scanf设置的值。

@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]);
....
$./a.out
1
2    # input breaks here and the following lines are printed....

1 

2 
我使用以下行打印结果:

printf("\n");
for (int i = 0; i < ROW; i++)
{
    for (int j = 0; j < COL; j++)
    {
        printf("%c ", array[i][j]);
    }
    printf("\n");
 }
但是,如果我使用以下行

do {scanf("%c",&array[i][j]);} while ( getchar() != '\n' );
而不是代码

scanf("%d", &array[i][j]);
在您的两个
for
循环中,它似乎按预期工作

输入和输出示例(数字实际上是字符):

当然,它也适用于信件:

$./a.out
a
b
c
d

a b #output
c d
@灯光:


顺便说一句,我调整了程序,结果证明,如果我使用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]);
....
$./a.out
1
2    # input breaks here and the following lines are printed....

1 

2 
我使用以下行打印结果:

printf("\n");
for (int i = 0; i < ROW; i++)
{
    for (int j = 0; j < COL; j++)
    {
        printf("%c ", array[i][j]);
    }
    printf("\n");
 }
但是,如果我使用以下行

do {scanf("%c",&array[i][j]);} while ( getchar() != '\n' );
而不是代码

scanf("%d", &array[i][j]);
在您的两个
for
循环中,它似乎按预期工作

输入和输出示例(数字实际上是字符):

当然,它也适用于信件:

$./a.out
a
b
c
d

a b #output
c d


我认为
&
的优先级高于
[]
,因此应该使用
scanf(“%d”、&(数组[I][j])
我最近了解到,
[]
具有最高优先级,因此我认为这不会有帮助。顺便说一句,我调整了程序,结果表明,如果我使用
int array
,就不会有问题。不过,我还是想知道为什么
char-array
会给出错误?GNU C手册说
[]
具有最高的优先级,所以
&array[I][j]
应该这样做。这可能是编译器错误或实际内存访问错误。@Light可能是因为您试图将
int
(可能是4或8个字节)放入
字符
(1个字节)。我认为
&
的优先级高于
[]
,因此您应该使用
scanf(“%d”、&(数组[I][j])
我最近了解到,
[]
具有最高优先级,因此我认为这不会有帮助。顺便说一句,我调整了程序,结果表明,如果我使用
int array
,就不会有问题。不过,我还是想知道为什么
char-array
会给出错误?GNU C手册说
[]
具有最高的优先级,所以
&array[I][j]
应该这样做。可能是编译器错误或内存访问错误。@Light可能是因为您试图将
int
(可能是4或8个字节)放入
char
(1个字节)中。是的,如果我将数组从
char
更改为
int
,则不会出错;但是,如果我需要使用
char
数组而不是任何其他类型,我应该在
scanf
中使用
%c
吗?尽管如此,使用
scanf(“%c”和&array[i][j])
给了我错误的输入(如果我让它们显示的话),它甚至不能完成整个循环。@这里似乎有答案。但我只需将其存储在一个临时int中,然后将其转换为char,例如:
intaux;scanf(“%d”和&aux);数组[i][j]=(char)aux。但是,请确保检查边界。是的,如果我将数组从
char
更改为
int
,则不会出错;但是,如果我需要使用
char
数组而不是任何其他类型,我应该在
scanf
中使用
%c
吗?尽管如此,使用
scanf(“%c”和&array[i][j])
给了我错误的输入(如果我让它们显示的话),它甚至不能完成整个循环。@这里似乎有答案。但我只需将其存储在一个临时int中,然后将其转换为char,例如:
intaux;scanf(“%d”和&aux);数组[i][j]=(char)aux。但是一定要检查边界。呵呵。。。实际上它起作用了。但是我想我想。。。我犯了一个愚蠢的错误(我不知道)。。。我输入了1,2和3,当我打印出数组时,我得到了ASCII键代码1,2和3。为什么?打印输出时,是否确保使用了
%c
,而不是
%d
?如果我输入
1234
并使用
%d
而不是
%c
我会得到
49505152
谢谢,伙计,现在它完美无缺了。(我以前用
%d
打印):@Light Nice:-)作为新用户,别忘了投票/接受答案。呵呵。。。实际上它起作用了。但是我想我想。。。我犯了一个愚蠢的错误(我不知道)