2014-02-04 4 views
-4

Я написал C++ кода и используемой-структуру, я хочу, чтобы сравнить два строки в структурах type.but возникновение ошибки:Comparision строка из структуры в случае заявление

#include <iostream> 
using namespace std; 

#define NumOfStudents 2 
#define NumOfCourses 3 

struct Student{ 
    int stdnum, FieldCode, age; 
    double average, marks, res[NumOfCourses]; 
    char Fname[20], Lname[20], cmp[20]; 
}; 


int main(){ 
    struct Student students[NumOfStudents]; 
    int i, j; 
    // char cmp[20]; 

    cout << "\t **********************************************************************\n"; 
    cout << "\t *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\n"; 
    cout << "\t *+ FIRST-NAME || LAST-NAME || STUDENT-NUMBER || FIELD-CODE || AGE +*\n"; 
    cout << "\t *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\n"; 
    cout << "\t **********************************************************************\n"; 

    for(i=0; i<NumOfStudents; i++){ 
    cout << "STUDENT #" << i+1 << ": "; 
    cin >> students[i].Fname >> students[i].Lname >> students[i].stdnum >> students[i].FieldCode >> students[i].age; 
    } 

    cout << "what student do you want?[Enter family]\n"; 
    cin >> students[j].cmp; 

    for(i=0; i<NumOfStudents; i++){ 
    if(students[j].cmp == students[j].Lname){ //The error occurs here 
     for(j=0; j<NumOfCourses; j++){ 
    cout << "\nCOURCE #" << j+1 << ": "; 
    cin >> students[j].marks; 
     } 
    } 
    else 
     cout << "The Student with name " << students[j].cmp << " doesn't exist!!!"; 
    } 
    return 0; 
} 

В коде я комментировал место произошла ошибка. ..

спасибо

+2

Сохраните массу проблем и используйте 'std :: string' вместо массивов' char'. – juanchopanza

+0

Я не знаю, как изменить код .. спасибо, если помогите мне – MLSC

ответ

3

конечно это сравнение

if(students[j].cmp == students[j].stdnum){  

является Inva потому что элемент данных cmp имеет тип char[20], а stdnum имеет тип int. Неясно, что вы собираетесь сравнивать.

EDIT: Я вижу, что вы обновили свой пост и написал

if(students[j].cmp == students[j].Lname){  

Однако это утверждение также недопустимо, так как массивы не имеют оператора сравнения. В этом условии оба массива преобразуются в указатели на их первые элементы, а указатели сравниваются. Таким образом, условие всегда будет равным false. Вместо этого вы должны использовать Strandard C Функция STRCMP

if(std::strcmp(students[j].cmp, students[j].Lname) == 0){ 

Было бы проще, если вы будете использовать зЬй :: строку вместо символьных массивов. Вам необходимо включить заголовочные <string>

В этом случае структура будет выглядеть следующим образом

struct Student{ 
    int stdnum, FieldCode, age; 
    double average, marks, res[NumOfCourses]; 
    string Fname, Lname, cmp; 
}; 

и вы можете использовать оператор сравнения

if(students[j].cmp == students[j].Lname){ 
+0

Зачем отрицательный? Я исправил его, прежде чем ответить другу.см. сообщение снова – MLSC

+0

@juanchopanza Очевидно, мы видели разные варианты вопроса. –

+0

нормально есть проблема ... мой запрос [после этого сравнения] постулатная работа ... знаете почему? спасибо – MLSC

0

Если вы уверены, что об использовании char строки, вы должны использовать функцию strcmp, чтобы сравнить их.

1

Это должно сделать трюк для вас.

if(strcmp(students[i].cmp, students[i].Lname) == 0) 
+0

my for statement [после этого сравнения] doent work..и знаете почему? – MLSC

+0

Вы пытались использовать 'j' перед внутренним циклом (где вы его инициализируете). – gmorrow

+0

да ... ты знаешь ... Я теперь в восторге ... вот почему я сделал такие ошибки ... – MLSC

0

Вы используете переменную j, которая не имеет никакого значения, возложенные на него. Из-за этого вы получаете доступ к неизвестному члену в массиве, вероятно, что-то вне границ массива (индекс больше NumOfStudents).

Я думаю, что вы хотите if(students[i].cmp == students[i].stdnum){ вместо if(students[j].cmp == students[j].stdnum){, тем не менее, следует отметить, что при сравнении двух char массивов, которые не имеют свой предполагаемый эффект сравнения двух строк. Вероятно, он будет сравнивать положение массивов в памяти (всегда будет оцениваться до false). Вместо этого используйте strcmp и используйте команды из библиотеки <cstring> при работе с cstrings (char arrays).

Или просто избавите себя от проблемы и используйте класс string, который перегружает оператор = и позволяет сравнивать две строки с помощью =.

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