Использование do-while для поиска элемента в структуре

У меня есть структура для сотрудников, идентификатор, возраст и зарплата. Мне нужно, чтобы пользователь выбрал, какого сотрудника они хотели бы отредактировать, введя свой идентификатор пользователя. Мне нужно использовать do-while для поиска в структуре, пока пользователь не введет действительный идентификатор пользователя.

Пока у меня есть:

РАЗМЕР = 4

case 3: //Updating Employee Salary
        printf("Update Employee Salary\n");
        printf("======================\n");

        do {
            printf("Enter Employee ID: ");
            scanf("%d", &salaryEmpChoice);
        } while (salaryEmpChoice != emp[0 - SIZE].id) ;

        break;

Для части while я пробовал [0 - SIZE], [0, 1, 2, 3], но это работает только тогда, когда я ввожу одно значение только за раз, т.е. [0] вместо всех 4 элементов.


person user9411342    schedule 26.02.2018    source источник
comment
Здесь недостаточно, чтобы понять, что вы хотите сделать, и недостаточно кода, чтобы увидеть, что происходит. Что такое эмп[]? Что такое РАЗМЕР? Является ли SIZE ›= 0 (значит, у вас есть положительный индекс в этом массиве)? Похоже, что этот код будет зацикливаться до тех пор, пока вы не получите зарплатуEmpChoice, равную одному конкретному значению в emp[].id. Если SIZE > 0, то этот индекс массива недействителен.   -  person Dave    schedule 26.02.2018
comment
@Dave Я пытаюсь зациклить его до тех пор, пока зарплатаEmpChoice не будет равна какому-либо конкретному значению в emp[].id, однако это не работает, и я не уверен, что делаю неправильно.   -  person user9411342    schedule 26.02.2018
comment
Тогда вам, вероятно, понадобится вложенный цикл внутри do..while для обхода массива emp, например, если SIZE - это размер массива emp, for ( i = 0; i < SIZE; ++i ) ...   -  person Dave    schedule 26.02.2018
comment
@Dave Где в do while я мог бы поместить вложенный цикл?   -  person user9411342    schedule 26.02.2018


Ответы (1)


Это потому, что язык C просматривает только один элемент за раз. Если вы хотите просмотреть ряд элементов, вам необходимо реализовать это. Компилятор не сделает это за вас.

Вы просите компилятор найти emp[0-SIZE].id и сравнить его с зарплатойEmpChoice. Вы устанавливаете SIZE равным 4, поэтому emp[0-SIZE] равно emp[0-4] == emp[-4].

Это говорит компилятору посмотреть, где хранится массив emp, а затем просмотреть 4 элемента массива ранее в памяти. После этого, поскольку вы ищете emp[-4].id, он будет искать в памяти часть отрицательного четвертого элемента, где он нашел бы идентификатор, если бы это был допустимый элемент массива. Это не то, что вам нужно, потому что массивы в C начинаются с нуля, поэтому отрицательные элементы не являются частью массива.

Если emp представляет собой массив структуры сотрудника, и вы ищете emp.id, вам нужно сравнить отсканированный идентификатор сотрудника с emp[0].id, emp[1].id, emp[2].id и т. д. ...

person Tom    schedule 26.02.2018
comment
Есть ли способ сравнить отсканированный идентификатор сотрудника со всеми моими emp[].id одновременно? - person user9411342; 26.02.2018
comment
Нет, не сразу. Вы должны перебирать их. Вы можете написать функцию или цикл, чтобы сделать это, или использовать то, что написал кто-то другой, но я не знаю ни одной встроенной в Си. вы говорите о чем-то, что вы найдете либо в библиотеке, либо в некоторых языках высокого уровня. - person Tom; 27.02.2018