2013-05-01 3 views
1

У меня есть программа, которая поиска в массиве, чтобы найти соответствие словус программой ++, которая находит тип полукокса * слова в полукокса * массив

char *mywords []={"Dog","Cat","etc"}; 
string search; 
cout<<"enter a word to search"<<endl; 
cin>>search; 
for(int n=0;n<3;n++) 
{ 
if(search==mywords[n]) 
    { 
    cout<<mywords[n]<<"found"<<endl; 
    } 
} 

Это работает, но мне интересно,

  1. почему она не работает, когда я изменить часть: string search; к char *search=new char; или char search[4]; он никогда не находит слово
  2. что различные между char* word("Dog"); и string word("Dog");.

ответ

2

ПЕРВЫЙ ВОПРОС:

а) почему она не работает, когда я изменить часть

При использовании char*, выражение:

search == mywords[n] 

Сравнение двух указателей типа char*, а не фактические строки с нулевым завершением, на которые указывают эти указатели.

При использовании std::string, с другой стороны, перегружен operator == что принимает std::string объект и const char* указатель выбран, и правильное сравнение строк выполняется.

Кроме того, имейте в виду, что у вас всегда есть delete объектов, выделенных new, или у вас будет утечка памяти. Это еще одна причина, почему использование std::string является предпочтительным.

ВТОРОЙ ВОПРОС:

б) то, что различные между char* word("Dog"); и string word("Dog");

В первом случае, вы инициализации указателя word, чтобы указать на первый символ строки литерал. "Dog" - уведомление, что тип word должен быть const char*, а не char*; это принудительное преобразование устарело в C++ 03 и запрещено в C++ 11.

Во втором случае, вы строите объект word типа std::string и передавая "Dog" строкового литерала на входе в конструктор std::string «s. Конструктор, в свою очередь, выделяет отдельный буфер, где копирует исходный строковый литерал, переданный в качестве аргумента.

+0

Большое спасибо, что было очень ясно и полезно – Sonicpath

+0

@SonicpathSonicwave: Рад, что это помогло. Если это ответит на ваш вопрос, пожалуйста, подумайте о том, чтобы отметить ответ как принятый :) –

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