2016-05-24 3 views
-3

Когда я пытаюсь запустить код, он запрашивает первый ввод, но затем он показывает ядро ​​сбрасывания.Ядро сбрасывается при запуске программы

И у меня есть некоторые сомнения, как я могу исправить это предупреждение fgets?

И пожалуйста, если этот код может быть оптимизирован, пожалуйста, скажите мне, I`m пытается сделать эффективный код: D

Compile с этим:

г ++ -O2 -Wall Proy2.cpp -o Proy2

Код:

#include <cstdio> 

#include <iostream> 

using namespace std; 

int main(){ 

    typedef struct PC{ 

    char Brand[20]; 
    char Model[20]; 
    char Serial[20]; 
    char Processor[10]; 

    }; 

    PC PC1[5],*machine; 

    unsigned int i; 

    for(i = 0; i < 4; i++){ 

    cout <<"Insert PC brand: "; 
     fgets(machine->Brand, 20, stdin); fflush(stdin); 

    cout <<"Insert PC model: "; 
     fgets(machine->Model, 20, stdin); fflush(stdin); 

    cout <<"Insert PC serial: "; 
     fgets(machine->Serial, 20, stdin); fflush(stdin); 

    cout <<"Insert PC processor: "; 
     fgets(machine->Processor, 10, stdin); fflush(stdin); 

    printf("PC Brand : %s", PC1[i].Brand); 
    printf("PC Model : %s", PC1[i].Model); 
    printf("PC Serial : %s", PC1[i].Serial); 
    printf("PC Processor: %s", PC1[i].Processor); 

    PC1[i] = *machine; 

    } 

    return 0; 
} 
+3

Ваша переменная 'machine' никогда не инициализируется, если это исправляет ее, скажите, чтобы я сделал полноценный ответ :) – saloomi2012

+1

« Ядро свалило попытку скомпилировать »- вы, кажется, говорите, что компилятор * разбился? Это необычно (но не неслыханно). – immibis

+1

Пожалуйста, решите, собираетесь ли вы использовать C или C++; 'fgets' должен быть' getline', а 'fflush (stdin):' является незаконным. И, конечно, вам нужно «machine = new PC», чтобы исправить вашу ближайшую проблему. –

ответ

1

cout является C++, printf является C. fgets также C, и должно быть getline (C++). Вы должны выбрать язык, а не смешивать оба. Char* является C и string является C++

Вашего класс или структура не должен быть в главном

#include <cstdio> 

#include <iostream> 

using namespace std; 

typedef struct PC{ 

    string Brand; 
    string Model; 
    string Serial; 
    string Processor; 

}; 

int main(){ 

    PC *PC1[5]; // pointer of pointers 
    PC *machine=new PC[4]; 

    unsigned int i; 

    for(i = 0; i < 4; i++){ 

     cout <<"Insert PC brand: "; 
     cin >> machine->Brand; 

     cout <<"Insert PC model: "; 
     cin >> machine->Model; 

     cout <<"Insert PC serial: "; 
     cin >> machine->Serial; 

     cout <<"Insert PC processor: "; 
     cin >> machine->Processor; 

     PC1[i] = machine; // you store the machine in PC1 

     cout << "PC Brand : " << PC1[i]->Brand << endl; 
     cout << "PC Model : " <<PC1[i]->Model << endl; 
     cout << "PC Serial : " <<PC1[i]->Serial << endl; 
     cout << "PC Processor: " <<PC1[i]->Processor << endl; 

    } 

    return 0; 
} 

используется PC1[5] и в цикле вы только даете 4 элементов (от 0 до 3 4 элементов) , Я вещь, которую вы хотите изменить ваш цикл

+0

Замените массивы 'std :: vector', и ваш ответ будет более ярким. –

+0

Бит89, похоже, не знает C или C++, он еще не готов для вектора – Hearner

+0

Я знаю векторы, но, на мой взгляд, простой массив имеет лучшую производительность, скажите, пожалуйста, если я ошибаюсь – Bit89

1

определяются две переменные

PC PC1 [5], * машина;

Средство

PC1 является массивом размера 5 и каждый элемент PC (каждый уже инициализирован по умолчанию CTOR)

машины PTR к ПК, и неинициализированная и не выделяется

Тогда вам заготавливают на машине

fgets (машино-> Brand, 20, STDIN)

и получить дампы, как машина uninitiali зет

Возможно вы угадать решение Теперь которое инициализировать машину

, как показано ниже в петле перед назначением что-нибудь

машина = & PC1 [я];

Кстати, ЬурейеЕ не требуется в С ++, когда вы определяете STRUCT/класс, как он автоматически ЬурейеЕ-е изд

0

Здесь вы печатаете неинициализированный переменную:

printf("PC Brand : %s", PC1[i].Brand); 

и по следующим направлениям , Вы никогда не писали никаких данных в PC1[i]. Вместо этого вы написали данные в объект, который вы new 'd и указали machine на.

Позже у вас есть строка:

PC1[i] = *machine; 

Я думаю, вы предназначены для этой линии, чтобы быть до printf линий.

Обратите внимание, что нет необходимости использовать динамическое распределение. Вместо этого вы могли бы написать PC machine;. Фактически вы можете читать прямо в PC1[i], даже не имея machine.

Смежные вопросы