我是一个完全的 C 初学者,一两周前才开始,我主要使用“C:一种现代方法”这本书,我真的,真的在与指针作斗争, 我正在尝试编写一个函数,提示用户逐行输入矩阵,即用户输入第 1 行,按回车键等。
这是我目前的代码:
for(int (*p)[M] = &a[0][0]; p <= &a[N-1][M-1]; p++)
{
scanf("%d", p);
}
在过去的 5 个小时里,我一直在为这个问题苦苦挣扎,我浏览了很多网站,但找不到任何帮助。
新的线路会影响到这个吗? scanf
让我很困惑。
能否以某种方式修改此代码以避免让用户输入矩阵的维度?它能以某种方式检测到换行符吗?
我知道错误肯定出在我对指针的理解上,所以如果您对我可以用来全面研究它们的资源有任何建议,我将非常感激。 提前致谢。
最佳答案
在文件 xx.c
中给出以下代码(非常接近于您在问题中显示的内容):
#include <stdio.h>
int main(void)
{
enum { M = 4, N = 5 };
int a[N][M];
for(int (*p)[M] = &a[0][0]; p <= &a[N-1][M-1]; p++)
{
scanf("%d", p);
}
return 0;
}
GCC 4.8.2 编译器(在 Ubuntu 12.04 衍生版本上运行)说:
$ gcc -g -O3 -std=c99 -Wall -Wextra -Werror -c xx.c
xx.c: In function ‘main’:
xx.c:8:21: error: initialization from incompatible pointer type [-Werror]
for(int (*p)[M] = &a[0][0]; p <= &a[N-1][M-1]; p++)
^
xx.c:8:33: error: comparison of distinct pointer types lacks a cast [-Werror]
for(int (*p)[M] = &a[0][0]; p <= &a[N-1][M-1]; p++)
^
xx.c:10:5: error: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘int (*)[4]’ [-Werror=format=]
scanf("%d", p);
^
cc1: all warnings being treated as errors
$
第一个错误是因为 p
是一个指向大小为 M 的数组的指针,而 &a[0][0]
只是一个指向 的指针整数
。比较失败类似。你可以这样写:
for (int (*p)[M] = &a[0]; p < &a[N]; p++)
然后 scanf()
错误需要解决。问题在于您将指向数组的指针传递给需要指向 int
指针的函数。此外,由于数组指针递增的工作方式,您正试图为整个一行数据读取一个数字。如果您沿着这条路继续前进,您将需要一个嵌套循环:
for (int *q = &(*p)[0]; q < &(*p)[M]; q++)
if (scanf("%d", q) != 1)
...process data format error...
另一方面,您可以通过以下方式简化您的生活:
for (int *p = &a[0][0]; p < &a[N][M]; p++)
if (scanf("%d", p) != 1)
...process data format error...
如果您需要使用指针(指向int
),我建议您采用这种方式。应尽可能避免指向数组的指针,这几乎总是如此。
这两个变体在这里被封装到一个程序中,连同使用数组索引的代码(由 Jim Balter 在 comment 中建议),这是最简单和最难出错的:
#include <stdio.h>
extern void error(const char *msg);
int main(void)
{
enum { M = 4, N = 5 };
int a[N][M];
// Pointers to arrays - nasty
for (int (*p)[M] = &a[0]; p < &a[N]; p++)
{
for (int *q = &(*p)[0]; q < &(*p)[M]; q++)
{
if (scanf("%d", q) != 1)
error("Bother");
}
}
// Pointers to int - OK
for (int *p = &a[0][0]; p < &a[N][M]; p++)
{
if (scanf("%d", p) != 1)
error("Bother");
}
// Array indices - can't go wrong easily!
for (int n = 0; n < N; n++)
{
for (int m = 0; m < M; m++)
{
if (scanf("%d", &a[n][m]) != 1)
error("Bother");
}
}
return 0;
}
关于c - 在 C 中获取二维数组的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21791823/