c - 在 C 中获取二维数组的输入

标签 c arrays matrix scanf

我是一个完全的 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 Baltercomment 中建议),这是最简单和最难出错的:

#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/

相关文章:

r - 使用 row, col 索引从矩阵中索引值

字符指针赋值

arrays - 从单元格的单元格数组中检索第一个值

c++ - 在 C++ 中通过输入创建和填充矩阵

python - 如何通过用户输入创建一个字符串数组并在 Python 中按字典顺序打印它们?

javascript - 具体的对象是如何从对象内部的数组中移除的? (使用 pop() 或其他解决方案)

c - 使用 c 进行矩阵加法

c - 有什么办法可以让这段代码变得更简单吗?

c - 我如何使用 strcastr()?

c - 转换为 void 时的警告**