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