Присвоение структуре другой структуры из массива структур - C (СИ)
Формулировка задачи:
Привет всем вот всё ковыряю задание с клубами. Из-за незнания нюансов и отсутствие практики не могу присвоить и отсортировать массив структур, помогите кому не лень ) Выбивает ошибку на sForSort = &aArrayClub[0];. Хочу score перевести в int и задействовать в сортировке но не могу присвоить дополнительной структуре структуру из массива которая бы вылетала, думаю мою мысль неглубокую понятно =) Кто может помочь помогите.
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*1) створіть структуру Club з полями: name - назва клубу; city - місто, яке він представляє;
* score - кількість набраних очок;*/
struct Club
{
char cCity[255];
char cName[255];
char cScore[255];
};
struct AdditionalStructForSort
{
char cCity[255];
char cName[255];
char cScore[255];
};
int main(void)
{
struct AdditionalStructForSort sForSort;
struct Club sClub;
signed int i;
for ( i = 0; i < 255; i++ )
{
sForSort.cCity[i] = 0;
sForSort.cName[i] = 0;
sForSort.cScore[i] = 0;
}
for ( i = 0; i < 255; i++ )
{
sClub.cCity[i] = 0;
sClub.cName[i] = 0;
sClub.cScore[i] = 0;
}
/* 2) створіть файл, в якій внесіть дані - майбутні значення полів структури Club
* (кожне поле - з нового рядка, без пробілів!), кількість клубів - не менше 10
* (розташувати у файлі в довільному порядку, не залежно від кількості очок);*/
FILE *pClub;
//3) збережіть створений файл як текстовий;
pClub = fopen ( "FileAllClubs.txt", "a+" );
printf ( "Input name city: " );
gets ( sClub.cCity );
printf ( "Input name club: " );
gets ( sClub.cName );
printf ( "Input score club: " );
gets ( sClub.cScore );
fprintf ( pClub, "%s\n%s\n%s\n", &sClub.cCity[0], &sClub.cName[0], &sClub.cScore[0] );
fclose ( pClub );
for ( i = 0; i < 255; i++ )
{
sClub.cCity[i] = 0;
sClub.cName[i] = 0;
sClub.cScore[i] = 0;
}
/*4) введіть з клавіатури число N - кількість клубів,
дані про які потрібно прочитати з файлу;*/
signed int N = 0;
printf ( "Input N: " );
scanf ( "%d", &N );
//5) виділіть динамічно пам’ять для масиву з n структур;
struct Club *aArrayClub = ( struct Club* ) malloc ( N * sizeof ( struct Club ) );
if ( ( aArrayClub = ( struct Club* ) malloc ( N * sizeof ( struct Club ) ) ) == NULL )
{
printf ( "ERROR\n" );
exit ( 1 );
}
pClub = fopen ( "FileAllClubs.txt", "r+" );
//6) прочитайте у відповідний масив максимально можливу кількість даних про клуби;
for ( i = 0; i < N; i++ )
{
fgets ( sClub.cCity, 255, pClub );
strcpy ( aArrayClub[i].cCity, sClub.cCity );
fgets ( sClub.cName, 255, pClub );
strcpy ( aArrayClub[i].cName, sClub.cName );
fgets ( sClub.cScore, 255, pClub );
strcpy ( aArrayClub[i].cScore, sClub.cScore );
puts ( aArrayClub[i].cCity );
puts (aArrayClub[i].cName );
puts ( aArrayClub[i].cScore );
}
fclose ( pClub );
/*7) здійснить сортування даного масиву за спаданням кількості очок клубів -
першим елементом щоб стала структура, клуб якої має максимальну кількість очок,
і далі - в порядку зменшення;Примітка: - з метою обміну структур місцями оголосіть
додаткову аналогічну структуру, в яку тимчасово будете копіювати ті, що підлягають перестановці;
доступ до елементів масиву структур здійснюйте за допомогою покажчиків!*/
signed int iValue = 0;
signed int iMaxScore = 0;
sForSort = &aArrayClub[0]; // <- Ошибка
iMaxScore = atoi( aArrayClub[0].cScore );
for( i = 0; i < N; i++ )
{
if( ( iValue = atoi( aArrayClub[i].cScore ) ) > iMaxScore )
{
iMaxScore = atoi( aArrayClub[i].cScore );
}
}
printf( "%d", iMaxScore );
/*8) дані відсортованого масиву виведіть до іншого текстового файлу
(по можливості використовуючи форматування для кращої читабельності);
перевірте файл на предмет правильного порядку розташування в ньому даних про клуби.*/
FILE *pFinalClub;
pFinalClub = fopen( "FinalClub.txt", "a+" );
//fprintf ("" );
fclose( pFinalClub );
return 0;
}
Говорят что можно по елементно присваивать но что других способов нету?
Решение задачи: «Присвоение структуре другой структуры из массива структур»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
struct Club
{
char cCity[255];
char cName[255];
char cScore[255];
} sClubSort = {"0","0","0"},
sClub = {"0","0","0"};
int main(void)
{
int i;
struct Club *arrClub = (Club*)malloc(sizeof(struct Club[5]));
if (arrClub){
printf("Memory good");
for(i=0;i<5;i++){
arrClub[i]=sClub;
}
for(int i=0; i<5; i++){
sClub=arrClub[i];
printf("\n %s \t %s \t %s \t",arrClub[i].cCity,arrClub[i].cName,arrClub[i].cScore);
}
}
free(arrClub);
system("pause");//windows console
}
Объяснение кода листинга программы
- Структура
Clubобъявлена с полямиcCity,cName,cScore. - Объявлен массив структур
arrClubтипаClub*размером 5. - Выделен память под массив структур с помощью
malloc. - Проверяется успешность выделения памяти с помощью
if (arrClub). - Если память успешно выделена, то выводится сообщение
Memory good. - В цикле
forмассивуarrClubприсваиваются значения структурыsClub. - В цикле
forвыводятся значения полей структурыarrClubна экран. - Выделяется память под
sClubс помощьюfree. - Выполняется
system(pause), чтобы приостановить выполнение программы до нажатия клавиши в консоли. - Значения полей структуры
sClubприсваиваются значениямarrClub[i].