【问题标题】:How to scan in unknown number of integers separated by spaces in C?如何在C中扫描未知数量的由空格分隔的整数?
【发布时间】:2017-07-22 09:54:37
【问题描述】:

我正在尝试开发一个程序,其中用户输入大小为 nxn 的矩阵,其中 n 为 10 或更小,并且程序必须将其旋转 90、180、270 度等。用户将首先输入矩阵的大小(“输入 n:”),然后通过一次输入多个以空格分隔的数字来填充矩阵。所以程序会说“输入矩阵的第 0 行:”,用户输入“1 2 3”、“输入矩阵的第 1 行:”等等。

我的问题是,当我不知道n 将有多大直到用户输入它时,我如何编写一个程序,将整数扫描到nxn 多维数组中。我知道 scanf("%d %d %d", matrix[0][0], matrix [0][1], matrix[0][2]); 可以用于第一行,如果我事先知道它将是一个 3 x 3 矩阵或scanf("%d %d %d %d", matrix[0][0], matrix [0][1], matrix[0][2], matrix[0][3]); 用于 4 x 4 矩阵,但在这种情况下,我直到之后才知道 n编写代码并由用户输入。我现在能想到的只有:

printf("Enter n: ");
scanf("%d", &n);

if (n == 3){
   printf("Enter row 0 of matrix: );
   scanf("%d %d %d", matrix[0][0], matrix [0][1], matrix[0][2]);
   printf("Enter row 1 of matrix: );
   scanf("%d %d %d", matrix[1][0], matrix [1][1], matrix[1][2]);
   printf("Enter row 2 of matrix: );
   scanf("%d %d %d", matrix[2][0], matrix [2][1], matrix[2][2]);
   // code to rotate 3x3 matrix
}
else if (n == 4){
   printf("Enter row 0 of matrix: );
   scanf("%d %d %d", matrix[0][0], matrix [0][1], matrix[0][2], matrix[0][3]);
   printf("Enter row 1 of matrix: );
   scanf("%d %d %d", matrix[1][0], matrix [1][1], matrix[1][2], matrix[1][3]);
   printf("Enter row 2 of matrix: );
   scanf("%d %d %d", matrix[2][0], matrix [2][1], matrix[2][2], matrix[2][3]);
   printf("Enter row 3 of matrix: );
   scanf("%d %d %d", matrix[3][0], matrix [3][1], matrix[3][2], matrix[3][3]);
   // code to rotate 4x4 matrix
}
else if (n == 5) {
// and so on...
}

但是,我知道这需要很长时间。有没有人可以帮忙?谢谢!

【问题讨论】:

  • 请阅读有关for 循环的内容 - 任何 C 编程书籍的第一章都有介绍
  • 我想我必须使用 for 循环,但是我如何在不知道提前输入多少数字的情况下在一行中扫描多个数字?
  • 重复调用scanf - 即scanf(" %d", ....)
  • 或许也可以阅读scanf 的手册页
  • scanf 工作时用户无需按回车

标签: c matrix spaces


【解决方案1】:

所以应该是这样的:

for (int i=0; i<n; i++) {
    printf ("Enter data for row %d:\n",i+1);
    for (int j=0; j<n; j++)
        scanf("%d ",&matrix[i][j]);
}

【讨论】:

  • 也许检查来自scanf的返回值?
  • @Ed,我更喜欢展示循环的简单性,而不是完整解决方案的防白痴性,但是是的,你是对的。
【解决方案2】:

首先,如果你必须使用标准输入,那么建立一个文件,命名为 inputfile.txt 并通过

./myprogram

否则输入整个矩阵变得太笨重了。

将第一行设为 n,即 n 行。然后遍历 n,并读取行,像这样

int i;
int n;
char buff[1024];
scanf("%d", &n);

for(i=0;i<n;i++)
{
   fgets(buff, 1024, stdin);
   /* now process here */
}

通过 strtok() 和 strtol() 处理行(假设输入整数)。

现在如何存储矩阵?最简单的方法是忘记所有关于 2D 数组的内容并简单地将其展平。所以假设是方阵,你可以这样分配它

int *mtx = malloc(n * n * sizeof(int));

然后你这样访问它(i和j是索引变量)

mtx[i*n+j] = x;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 2020-09-04
    • 2016-03-12
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多