Stricmp не работает - PullRequest
       0

Stricmp не работает

1 голос
/ 11 сентября 2010

У меня проблема с использованием stricmp в определенной функции, в других функциях она работает отлично, кроме этой. проблема в том, что даже если он сравнивает одну и ту же строку (char *), он не возвращает 0. в чем может быть проблема? (извините за беспорядок, я постараюсь отформатировать его) это код:

Employee* CityCouncil::FindEmp(list<Employee*> *lst, char* id)  
{  
 bool continue1 = true;  
 Employee* tmp= NULL;  
 char* tmpId = NULL, *tmpId2 = NULL;  
 list<Employee*>::iterator iter = lst->begin();  
 if ((id == NULL) || (lst->empty()==true))  
  return NULL;  
 while ((iter != lst->end()) && (continue1)){  
  tmp = (Employee*)(*iter);  
  tmpId = (*tmp).GetId();  
  if(tmpId != NULL)  
  {  
      if(stricmp(tmpId,id) == 0)  
       continue1 = false;  
  }  
  if (continue1 == true)  
  iter++;  
 }  
 if (iter == lst->end())
     return NULL;
 return (Employee*)(*iter);
}

Ответы [ 2 ]

5 голосов
/ 11 сентября 2010

Никогда не обвиняйте функцию, которая принадлежит библиотеке C.stricmp, безусловно, работает как положено, то есть строки действительно разные.Должно быть что-то не так с логикой в ​​этой функции - вы должны использовать операторы printf, чтобы выяснить, где и почему строки различаются.

РЕДАКТИРОВАТЬ: Я собрал простую тестовую программу,Это работает для меня:

#include <stdio.h>
#include <list>
using namespace std;

// Dummy
class Employee
{
    public:
        Employee(const char *n){ id = strdup(n); }
        char *id;
        char *GetId() { return this->id; }
};

Employee* FindEmp(list<Employee*> *lst, char* id)
{
    bool continue1 = true;
    Employee *tmp = NULL;
    char* tmpId = NULL;

    list<Employee*>::iterator iter = lst->begin();
    if(id == NULL || lst->empty())
        return NULL;

    while(iter != lst->end() && continue1)
    {
        tmp = (Employee*)(*iter);
        tmpId = (*tmp).GetId();
        if(tmpId != NULL)
        {
            if(stricmp(tmpId,id) == 0)
                continue1 = false;
        }
        if(continue1 == true)
            iter++;
    }

    if(iter == lst->end())
        return NULL;

    return (Employee*)(*iter);
}


int main(int argc, char **argv)
{
    list<Employee*> l;

    l.push_back(new Employee("Dave"));
    l.push_back(new Employee("Andy"));
    l.push_back(new Employee("Snoopie"));

    printf("%s found\n", FindEmp(&l, "dave")->GetId());
    printf("%s found\n", FindEmp(&l, "andy")->GetId());
    printf("%s found\n", FindEmp(&l, "SnoOpiE")->GetId());

    return 0;
}

Обратите внимание, что я использовал предоставленную вами функцию.Опять же, в stricmp нет ничего плохого, проблема должна быть в вашем коде.

1 голос
/ 11 сентября 2010

Ваш код выглядит правильно;может быть, вы не передаете строки, которые, по вашему мнению, есть, или, может быть, память как-то повреждена?

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

// Why is this a method off of CityCouncil?  As written, it
// doesn't use any CityCouncil members.
//
// Also, why not pass lst by reference?  Like this:
//    Employee* CityCoucil::FindEmp(list<Employee*>& lst, char *id) { ...
//
// Also, const correctness is a good idea, but that's more complicated.
// Start with this:
//    Employee* CityCoucil::FindEmp(const list<Employee*>& lst, const char *id) { ...
//
// Also, it's easy to leak memory when using a list of pointers, but that's
// another topic.
Employee* CityCouncil::FindEmp(list<Employee*> *lst, char* id)  
{
    // No need for continue1; we'll use an early return instead;
    // No need for tmp, tmpId, tmpId2; just call methods directly
    // off of iter.

    if (id == NULL || lst->empty())
        return NULL;

    // You should NOT do a C-style "(Employee*)" cast on *iter.
    // C-style casts are generally to be avoided, and in this case, 
    // it shouldn't be necessary.

    // Use a for loop to simplify your assigning iter and incrementing it.
    for (list<Employee*>::iterator iter = lst->begin(); iter != list->end(); iter++) {
        if ((*iter)->GetId()) {
            if (stricmp((*iter)->GetId(), id) == 0) {
                return *iter;
            }
        }
    }  
    return NULL;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...