【问题标题】:How can I make scanf and printf functions of an array in C?如何在 C 中创建数组的 scanf 和 printf 函数?
【发布时间】:2018-07-04 02:11:00
【问题描述】:

我正在尝试创建两个单独的函数,一个用于读取数组,另一个用于打印它。 我的代码如下所示:

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

void read(int n, int v[100])
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&v[i]);
    }
}

void print(int n, int v[100])
{
    for(int i=0;i<n;i++)
    {
        printf("%d",v[i]);
    }
}

int main()
{
    int v[100];
    int n;
    read(n,v);
    print(n,v);
}

但如果我读到这样的东西

5
1
2
3
4
5

它打印这个:

12345167773430408951321408978481140419686004089785612740906704021677734340894

和其他数字。有什么建议吗?

【问题讨论】:

  • read() 没有在 main 中设置 n 的值——它设置了一个本地副本。你需要让 read 接受一个指针并传入 &n。
  • read(n,v);print(n,v); 正在使用 未初始化变量 n
  • 您可能希望在数字之间打印一些空格。 %d 不打印任何内容。
  • @LeeDanielCrocker 说了什么。或者只是让read() 返回计数而不是使用指针参数。
  • void print 中打印的数组int v[100]; 也未初始化。请理解函数中定义的局部变量具有不确定的值。

标签: c arrays function printf scanf


【解决方案1】:

这是一个程序,它可以做你想做的事情。

#include <stdio.h>

// Function Prototypes Start
void array_reader(int array_length, int array[]);
void array_printer(int array_length, int array[]);
// Function Prototypes End


int main(void) {

    int max_amt_to_scan;
    printf("How many numbers would you like to scan in?\n");
    scanf("%d", &max_amt_to_scan);

    int num_array[max_amt_to_scan];

    printf("Please enter %d numbers!\n", max_amt_to_scan);
    array_reader(max_amt_to_scan, num_array);

    printf("The numbers you entered were:\n");
    array_printer(max_amt_to_scan, num_array);

    return 0;
}


// Scans or reads in numbers, into an array
void array_reader(int array_length, int array[]) {

    int i = 0;
    while (i < array_length) {

        scanf("%d", &array[i]);
        i++;
    }
}


// Prints out an array of numbers
void array_printer(int array_length, int array[]) {

    int i = 0;
    while (i < array_length) {

        if (i == (array_length - 1)) {
            printf("%d\n", array[i]);
        } else {
            printf("%d, ", array[i]);
        }
            i++;
    }
}

【讨论】:

    【解决方案2】:

    您不会在 main 中初始化 nmain 中的nread 中的n 是不同的变量,因此更改read 中的n 不会影响n 中的n,它保持未初始化状态,因此您有print 中的未定义行为。

    您必须将n 作为指针传递,或者read 必须返回n

    void read(int &n, int v[100])
    {
        scanf("%d",n);
        for(int i=0;i<*n;i++)
        {
            scanf("%d",&v[i]);
        }
    }
    
    int main()
    {
        int v[100];
        int n;
        read(&n,v);
        print(n,v);
    }
    

    int read(int v[100])
    {
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&v[i]);
        }
        return n;
    }
    
    int main()
    {
        int v[100];
        int n = read(v);
        print(n,v);
    }
    

    【讨论】:

      【解决方案3】:

      它应该是这样的:

      void read(int *array, int size)
      {
          printf("Now enter %d values:\n", size);
          for(int i = 0; i < size; i++)
          {
              scanf("%d", array + i);
              /* array + i = &(array[i]) */
          }
      }
      
      void print(int *array, int size)
      {
          printf("Here is your array:\n");
          for(int i = 0; i < size; i++)
          {
              printf("%d%c", array[i], i == size - 1 ? '\n' : ' ');
              /* ternary puts spaces and \n at the end */
          }
      }
      
      int main()
      {
          int size;
          printf("Enter array size :\n");
          scanf("%d", &size);
          int array[size];  /* Keep one array */
          read(array, size);
          print(array, size);
      }
      

      【讨论】:

      • @FredLarson 哇,谢谢,我从来没有意识到我错了。我敢肯定,我在某处看到它这样写,现在互联网上有太多错误的信息......
      • 也许您使用的是问题中引用的同一本烂书。
      • @FredLarson 不,我实际上从未打开过“书”,只有在线资源。我怀疑错误的信息只会存在很长时间。
      • 从在线资源中学习 C 可能不是一个好主意。请注意,C 函数是按值调用的,所以我怀疑像 void read(int n, int v[100]); 这样的函数原型会使许多人误以为数组的值是在函数调用中传递的。然而:1)函数原型中的数组类型被调整为适当的指针,使实际原型void read(int n, int *v);,和2)数组在大多数表达式中衰减为指向它们的第一个元素的指针,所以read(n, v);传递一个指向第一个元素的指针v 按值(副本)到read()
      • 在除sizeof_Alignof 之外的所有表达式中以及与一元&amp; 运算符一起使用时。 6.3.2.1 Lvalues, arrays, and function designators (p3)
      【解决方案4】:

      好的,我通过全局声明变量 n 和 v[100] 解决了这个问题。 谢谢。

      编辑

      我也尝试使用指针,它看起来像这样:

      #include<stdio.h>
      void read(int a[], int* n)
      {
          scanf("%d",n);
          for(int i=0;i<*n;i++)
          {
              scanf("%d",&a[i]);
          }
      }
      void print(int a[], int n)
      {
          for(int i=0;i<n;i++)
              printf("%d ",a[i]);
      
      }
      void main()
      {
          int a[20],n;
          read(a,&n);
          print(a,n);
      }
      

      而且它有效。

      【讨论】:

      • 全局变量通常不是答案。在这里,它们不是答案。
      • 非常糟糕的解决方案,一个逃避。请学习如何处理局部变量。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      • 1970-01-01
      相关资源
      最近更新 更多