【问题标题】:Using scanf() to input a square of integers使用 scanf() 输入一个整数的平方
【发布时间】:2012-07-06 20:42:39
【问题描述】:

我正在编写一个 c 项目,需要用户输入一个 N*N 整数平方:也就是说输入 N 行 N 个整数。该算法工作正常。

现在我希望用户输入 N 行,每行 N 个整数,每个连续的整数都用空格分隔。在这里,我没有正确使用 scanf,因为我试图声明整数数组但我无法处理间距。

我尝试过这样的事情,非常不自然并且失败了:

int i=0;
int j=0;

int N;
scanf("%d",&N);

char c[N][2*N-1];

while(i < N){
    scanf("%s",&c[i]);
    i++;
}

i=0;
j=0;
while (i<N){
    while (j<N){
        c[i][j]=c[i][2*j]-48;
        j++;
    }
    j=0;
    i++;
}

有人可以帮忙吗?

最好, 纽本

【问题讨论】:

  • 如果你需要一个“正方形”,为什么你的数组被声明为一个“矩形”? 2*N-1作为第二维从何而来?
  • 风格很重要。以后请尽量保持整洁。
  • 因为在第 n 次输入时,用户跳到行,所以按回车键

标签: c scanf


【解决方案1】:

如果我理解您的原始代码应该做什么,那么这段代码应该实际执行(并再次打印出来以证明它有效)。

您需要动态分配数组,因为它是可变大小的(在 C99 中,您可以在堆栈上使用可变大小的数组,但这确实是一个不同的讨论)。

scanf 将自动忽略整数之间的空格(包括空格和换行符),因此您无需手动解析。

#include <stdlib.h>
#include <stdio.h>

int main()
{
    int i=0, j=0, N;
    int **c;

    scanf("%d",&N);

    c = malloc(N*sizeof(int*));

    for (i=0;i<N;i++)
    {
        c[i] = malloc(N*sizeof(int));
        for (j=0;j<N;j++)
        {
            scanf("%d",&c[i][j]);
        }
    }

    for (i=0;i<N;i++)
    {
        for (j=0;j<N;j++)
        {
            printf("%d ",c[i][j]);
        }
        printf("\n");
        free(c[i]);
    }
    free(c);
    return 0;
 }  

为了完整性而没有 malloc/free 的 C99 替代方案(我从不喜欢这个 C99 功能,因为无法检查堆栈上的空间是否足够):

#include <stdlib.h>
#include <stdio.h>

int main()
{
    int i=0, j=0, N;

    scanf("%d",&N);

    int c[N][N];

    for (i=0;i<N;i++)
    {
        for (j=0;j<N;j++)
        {
            scanf("%d",&c[i][j]);
        }
    }

    for (i=0;i<N;i++)
    {
        for (j=0;j<N;j++)
        {
            printf("%d ",c[i][j]);
        }
        printf("\n");
    }
    return 0;
 }  

【讨论】:

  • @Newben 什么 C 编译器不支持malloc()free()?你在做#include stdlib.h&gt;会发生什么或者你怎么知道它不支持这两个功能?
  • Oups,可能malloc和free都被识别了,其实错误是一个未定义的变量c
  • 所以我不熟悉这种使用变量的方式。我应该如何声明 c ?
  • 好的抱歉修复了。粘贴之前整理得有点过头了。
  • 老实说,我并不想以任何方式冒犯他人,但如果您不熟悉动态内存分配或指针,您应该在再次发帖之前阅读一本关于 C 编程的书。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
相关资源
最近更新 更多