分配给具有数组类型错误的表达式

时间:2018-11-28 15:38:41

标签: c arrays pointers for-loop struct

在此程序中,我尝试按降序对客户节省进行排序。而且我尝试编译代码。而且我仍然不了解指针。消息“分配给数组类型错误的表达式”出错。该程序的目标输出往往是经过分类的客户(及其姓名和帐号)。我已经在互联网上搜索了该错误。但是我仍然没有解决方案。有人可以帮助我解决错误吗?谢谢。

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

struct Data
{
  long long int Savings[100], AccNo[100];
  char Name[100];
};

int main ()
{
  struct Data *ptr;
  int n, i, j, swap = 1, x, y;
  long long int max, min, temp;

  printf ("Enter number of customer(s) : ");
  scanf ("%d", &n);

  ptr = (struct Data *) malloc (n * sizeof (struct Data));

  for (i = 0; i < n; i++)
    {
      printf ("Enter customer %d", i + 1);
      printf ("\nName : ");
      getchar ();
      scanf ("%[^\n]s", &(ptr + i)->Name);
      printf ("Savings : ");
      scanf ("%d", &(ptr + i)->Savings);
      printf ("Account Number : ");
      scanf ("%d", &(ptr + i)->AccNo);
      printf ("\n");
    }

  //Sorting bubblesort
  for (x = 0; x < n; x++)
    {
      for (y = 0; y < (n - x - 1); y++)
    {
      if ((ptr + y)->Savings > (ptr + y + 1)->Savings)
        {
          temp = (ptr + y)->Savings;
          (ptr + y)->Savings = (ptr + y + 1)->Savings;
          (ptr + y + 1)->Savings = temp;
        }
    }
    }

  //Print sorted
  printf ("\n Sorted customers are (:\n");
  for (i = 0; i < n; ++i)
    {
      printf ("%s\n", (ptr + i)->Name);
      printf ("%d\n", (ptr + i)->Savings);
    }
  free (ptr);
  return 0;
}

1 个答案:

答案 0 :(得分:0)

  1. 您需要在启用警告的情况下编译代码,这将指导您 您逐步调试。尝试消除一个,并且 再次编译。例如,在GCC中,您将使用-Wall标志。
  2. 结构的数字字段应该只是数字,而不是数字 数组。此外,将其类型设置为long long int似乎有点 太多了,但我留给你。
  3. 具有(ptr + y)->Savings来访问数组的第y个元素 结构及其字段名称Savings在技术上是正确的, 但它更清洁(因此提高了可读性, 可维护性)来编写ptr[y].Savings。这是一般规则, 应用于其余的代码。
  4. 我相信以上所述会导致您在您犯两个语法错误时 正在使用scanf()读取客户的数值数据, 因为您知道一个整数通常需要&运算符。如果 从一开始就使用干净的方法, 我相信那些。
  5. 对于long long int,请使用%lld格式说明符,而不仅仅是%d
  6. 在Bubblesort中,当您发现需要交换的元素时, 交换整个元素,而不只是交换它们的Savings。我建议 创建一个函数来做到这一点。
  7. scanf("%[^\n]s"没什么意义,我将其更改为 scanf("%99s",其中99是字符串的最大大小,减去 一。在scanf(“%[^\n]s”,a) question的第二段中了解更多信息。

将所有内容放在一起,我们得到:

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

struct Data {
    long long int Savings, AccNo; // these should be numbers, not arrays
    char Name[100];
};

void swap(struct Data* a, struct Data* b) {
    struct Data tmp;
    tmp.Savings = a->Savings;
    tmp.AccNo = a->AccNo;
    strcpy(tmp.Name, a->Name);

    a->Savings = b->Savings;
    a->AccNo = b->AccNo;
    strcpy(a->Name, b->Name);

    b->Savings = tmp.Savings;
    b->AccNo = tmp.AccNo;
    strcpy(b->Name, tmp.Name);
}

int main() {
    struct Data *ptr;
    int n, i, x, y;

    printf("Enter number of customer(s) : ");
    scanf("%d", &n);

    ptr = malloc (n * sizeof(struct Data)); // do not cast malloc

    for(i=0; i<n; i++) {
        printf("Enter customer %d", i+1);
        printf("\nName : ");
        getchar();
        scanf("%99s", ptr[i].Name); // ptr is a pointer, but now you want to actually use it as an array, so use '.'
        printf("Savings : ");
        scanf("%lld", &ptr[i].Savings); // needs &, just like you did for 'n'. USe `%lld' for long lont int as the format specifier.
        printf("Account Number : ");
        scanf("%lld", &ptr[i].AccNo);   // needs &, just like you did for 'n'. USe `%lld' for long lont int as the format specifier.
        printf("\n");
    }

    //Sorting bubblesort
    for (x = 0; x < n; x++)
    {
        for (y = 0; y < n - x - 1; y++) // you don't need paranetheses in the stop condition
        {
            if (ptr[y].Savings > ptr[y + 1].Savings)
            {
                swap(&ptr[y], &ptr[y + 1]); // swap the whole element, not just its savings
            }
        }
    }

    //Print sorted
    printf("\nSorted customers are:\n");
    for(i=0; i<n; ++i)
    {
        printf("%s\n", (ptr+i)->Name);
        printf("%lld\n", (ptr+i)->Savings);
    }
    free(ptr);
    return 0;
}

输出(带有相关输入):

Sorted customers are:
George
1
Babis
3
Theodor
20

PS:Do I cast the result of malloc?不!