【问题标题】:Storing an array in C在 C 中存储数组
【发布时间】:2023-02-08 02:46:10
【问题描述】:

上下文:我需要编写一个程序来接受将存储到数组中的输入。在存入数组之前,必须检查输入的数字是否已经存在于数组中。如果不存在,则将其存储到数组中。如果存在,将询问另一个输入。

现在,我的代码将从用户那里获取输入,但该代码仅适用于第一个输入。在最后一次输入之前,它不会第二次工作。任何指针?

这是我的代码:

#include<stdio.h>
#define size 5

main()
{
int i;
arr[size];
input;

printf("This program will accept ");
printf("unique inputted numbers that will be stored");
printf(" in an array\n");
for(i = 0;i < size;i++)
{
    printf("Enter input: ");
        scanf("%d",&input);
        
    if (unique(arr,input,i))
        arr[i] = input;
    else
        i--;                                                             
   //decrement i because ask for input again
}
for(i = 0;i < size;i++)
    printf("%d ",arr[i]);

}

int unique(int arr[],int input,int i)
{
int n, z;
n = 0;
z = 1;

while(i > n)
{
    if(arr[n] == input)
    {
        scanf("%d",&n);
        z = 0; 
        break;
    }
    else
        n=1;
        break;
}
    
return z;
}

【问题讨论】:

  • unique 函数中执行 scanf 是非常糟糕的设计。 unique 唯一应该做的就是返回 0 input 已经在数组中。
  • 另外声明为 arr[size];input; 已经过时了一段时间(不确定,可能是 20 年左右)。使用int arr[size];int input;
  • 所以... unique for i==1 将返回 1,到目前为止一切顺利。对于更高的i,它会将输入与arr[0]进行比较,并告诉您它们是否不相等。如果它们相等,它将读取并丢弃一个数字。你确定你的功能完全正确吗?
  • 您应该打开编译器警告并阅读它们。对于 GCC 或 clang,请使用 -Wall -Wextra -pedantic。您应该为 main 和您的变量提供正确的类型。在调用该函数之前,您应该为 unique 提供原型。
  • 用数字填充另一个数组并保持排序 (qsort)。当有新条目时,搜索 (bsearch) 数组以查看它是否已存在。如果是这样,相应地打印一条错误消息。否则,在数组中填充另一个条目。并转到步骤 2。

标签: c


【解决方案1】:

您的代码在多个级别都是错误的:

  • unique 函数中的逻辑错误。
  • unique 函数中执行 scanf 是非常糟糕的设计。如果input 已经在数组中,unique 唯一应该做的就是返回 0。
  • 你在这里使用了隐式变量声明:arr[size]; input;,应该是int arr[size]; int input;
  • 您应该使用描述性变量名称,这样可以使您的代码更易于理解。

这是一个工作示例(cmets 中的解释)。

#include <stdio.h>

#define SIZE 5   // use capitals for macros (this is a convention)

int unique(int arr[], int value, int arrsize)
{
  for (int i = 0; i < arrsize; i++)
  {
    if (arr[i] == value)
    {
      return 0;   // value found in array
    }
  }

  return 1;       // value not found in array
}


void Test(int arr[], int arrsize, int value, int expected)
{
  if (unique(arr, arrsize, value) != expected)
    printf("Test failed for value %d
", value);
}

void runtests()
{
  int arr[] = { 1,2,3 };
  Test(arr, 4, sizeof(arr) / sizeof(*arr), 1);
  Test(arr, 1, sizeof(arr) / sizeof(*arr), 0);
  Test(arr, 3, sizeof(arr) / sizeof(*arr), 0);
}


#define size 5

int main()
{
  int i;
  int arr[size];   // declare int variable
  int input;       // declare int variable

  printf("This program will accept unique inputted numbers that will be stored in an array
");

  for (i = 0; i < size; i++)
  {
    printf("Enter input %d: ", i + 1); 
    scanf("%d", &input);

    if (unique(arr, input, i))  // value already in the array?
      arr[i] = input;           //  no => put it there
    else
    {                           // yes => ask again
      printf("  >> %d is already in the array
");
      i--;
    }
  }

  for (i = 0; i < size; i++)
    printf("%d ", arr[i]);
}

这段代码中还有两个函数Testruntests。这段代码不调用它们,但它们对于调试非常有用。作为练习,尝试了解为什么它们在代码的调试阶段很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2011-09-17
    • 1970-01-01
    • 2016-01-15
    • 2021-07-15
    • 2011-08-20
    • 2011-12-11
    相关资源
    最近更新 更多