2013-05-08 2 views
1

Абсолютный новичок здесь (ПЕРВАЯ ПОЧТА), и я как раз закончил назначение, где мне пришлось создать программу, которая позволяет пользователю создавать зарплату работника, а затем отображает их на поиск по фамилии, имени, номеру сотрудника и т. д.Пользовательский ввод принимается, вводятся ли они в верхнем регистре или в нижнем регистре в C++

У меня возникла проблема, если я создаю запись для Нэнси Дэвидсон, например Я могу правильно вывести эту запись, если я буду искать ТОЧНО Нэнси или Дэвидсона. Если я ищу nancy или davidson, он не найдет его.

Я использую структуру для хранения данных каждого сотрудника, записывая их в файл данных, а затем просматривая этот файл для отображения записи.

Есть ли способ, по которому я могу получить запись, пока она отображается, даже если я ищу NAncY?

Это мой код для моего Поиск по функции Фамилия:

//Record search by employee SURNAME only 
void searchSurname(Employee data[], int row) 
{ 
    string surname, again; 
    double wholeTot=0, wholeNet=0; 
    again = "y"; 

    while (again=="y"||again=="Y") 
    { 
     row=0; 
     bool found = false; 
     clrscr(); 
     cout << "Please enter Employee SURNAME : "; 
     Input(surname); 
     clrscr(); 
     cout << "Surname Search results for " << surname << ". \n\n\n"; 
     readFile (data, row); 
     int stop=row; 
     for (row = 0; row < (stop) ; row++) 
      if (surname == data[row].surname) 
      { 
       deconvertDate(data[row].date); 
       cout << " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl 
        << " # Employee Number - " << RIGHT(19,2) << data[row].empnum << " #" << endl 
        << " # Employee Surname - " << RIGHT(18,2) << data[row].surname << " #" << endl 
        << " # Employee Forename - " << RIGHT(17,2) << data[row].forename << " #" << endl 
        << " # Department Number - " << RIGHT(17,2) << data[row].dept << " #" << endl 
        << " # Normal Hours Worked - " << RIGHT(15,2) << data[row].hours << " #" << endl 
        << " # Overtime Hours Worked - " << RIGHT(13,2) << data[row].ohours << " #" << endl 
        << " # Pay Rate - " << RIGHT(26,2) << data[row].rate << " #" << endl 
        << " # Gross Pay - " << RIGHT(25,2) << data[row].grosspay << " #" << endl 
        << " # Tax - " << RIGHT(31,2) << data[row].tax << " #" << endl 
        << " # National Insurance - " << RIGHT(16,2) << data[row].natin << " #" << endl 
        << " # Total Deductions - " << RIGHT(18,2) << data[row].totalDeduct << " #" << endl 
        << " # Net Pay - " << RIGHT(27,2) << data[row].net << " #" << endl 
        << " # Week Ending - " << RIGHT(23,2) << data[row].date << " #" << endl 
        << " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl << endl << endl; 
       wholeTot+=data[row].grosspay; 
       wholeNet+=data[row].net; 

       cout << "The total recorded GROSS PAY of " << data[row].surname << " is :" << wholeTot << endl; 
       cout << " and the total recorded NET PAY is :" << wholeNet << endl << endl; 

       found = true; 
      } 
      else 
       if (found = false) 
       { 
        cout << "No results found for that SURNAME!" << endl; 
       } 
+1

Если бы вы могли обеспечить небольшой образец кода, который показывает проблему и компилирует это позволит нам лучше помочь вам. Простым ответом является то, что при сравнении, но без кода, мы не можем предоставить более высокое значение. –

+2

Записывайте все имена при их сохранении. Заполните поиск до начала поиска. Вот и все. – stardust

+2

Лучший способ - преобразовать текст, который вы сравниваете с верхним или нижним регистром, при сравнении (=> вы храните и собираете их по своему усмотрению, но вы сравниваете их все в нижнем/верхнем регистре) –

ответ

3

При вызова std::equal для сравнения, вы можете дать ему четвертый аргумент с устройством сравнения. Просто напишите компаратор , который делает регистрозависимость сравнения:

struct CaseInsensitiveCmp 
{ 
    bool operator()(char lhs, char rhs) const 
    { 
     return ::tolower(static_cast<unsigned char>(lhs)) 
      == ::tolower(static_cast<unsigned char>(rhs)); 
    } 
}; 

(При этом используется один аргумент tolower функцию в <ctype.h>, который является самым простым решением для новичка в производстве коде, конечно, вы бы. использовать std::ctype огранку в
<locale>.)

+0

Конечно. Конечно. Конечно. –

2

Вы хотите сделать сравнение без учета регистра. strcasecmp может быть хорошим началом: http://linux.die.net/man/3/strcasecmp

+3

Что, конечно, только работает на платформах Posix (если вы сами не пишете 'strcasecmp'). –

3

Уловка обычно заключается в том, чтобы преобразовать как сохраненную запись, так и входную запись пользователя в нижнем регистре или в верхнем регистре. Для этого вы можете использовать toupper или tolower