в этой программе я пытаюсь отсортировать сбережения клиентов по убыванию. И я пытался скомпилировать код. А насчет указателя я до сих пор не понимаю. Ошибка с сообщением «Присваивание выражению с ошибкой типа массива». Целевым результатом этой программы, как правило, являются отсортированные клиенты (с их именами и номерами счетов). Я поискал в Интернете информацию об этой ошибке. Но я все еще не понимаю решения. Может кто-нибудь помочь мне решить ошибку? Спасибо.
#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;
}
А где возникает эта ошибка?
Кроме того, я не думаю, что Savings и AccNo должны быть массивами.
temp = (ptr + y)->Savings; неверен: temp - это long long, но правая сторона - это struct Data *.
scanf("%[^\n]s" попытается прочитать буквально фактический 's'. 'S' не входит в строку преобразования
Ошибка возникает в (ptr + y)->Savings = (ptr + y + 1)->Savings; и (ptr + y + 1)->Savings = temp; @PaulOgilvie
В алгоритме пузырьковой сортировки вы пытаетесь сопоставить массив long long int Savings[100] с простым long long int temp. Конечно, пример пузырьковой сортировки, который вы использовали в качестве основы для своего кода, работал с указателями объектов, присваивая указатели указателям, но вы смешиваете массивы и отдельные переменные.





-Wall.long long int кажется немного
слишком много, но я оставляю это на вас.(ptr + y)->Savings для доступа к y-му элементу массива
структур и их имена полей Savings технически корректны,
но он намного чище (что увеличивает читабельность и
ремонтопригодность) для записи ptr[y].Savings. Это общее правило,
применительно к остальной части вашего кода.scanf(),
поскольку вы знаете, что целое число обычно требует оператора &. Если
вы использовали чистый подход с самого начала, вы бы не сделали
те, я полагаю.long long int используйте спецификатор формата %lld, а не только %d.Savings. я рекомендую
создание функции для этого.scanf("%[^\n]s" особого смысла не имеет, я бы поменял на
scanf("%99s", где 99 - максимальный размер вашей строки минус
один. Подробнее читайте во 2-м абзаце в scanf («% [^ \ n] s», a) вопрос.Собирая все вместе, получаем:
#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: Могу ли я использовать результат malloc? Нет!
Большое тебе спасибо! Я очень ценю это.
@SALOMO добро пожаловать в Stackoverflow! Вы разместили вопрос с MCVE, и это очень хорошо! В следующий раз сделайте также отступ в коде +1! ;)
Сообщение об ошибке пришло с номером строки, не так ли?