2014-02-05 2 views
0

Я делаю программу, которая проверит существование строки в массиве строк. Я сделал простую функцию, чтобы сделать так:Сбой функции C++ isMember

bool isMemberOfArrayStr(std::string str, std::string array[256]){ 
    for(int i=0;array->length()<10;i++){ 
    if(array[i]==str){ 
     ret=true;//A global variable that will be reset to false after the function call 
    } 
    } 
    return ret; 
} 

Определение функции не вызывает никаких ошибок, но вызов:

if(neighbors[2] == isMemberOfArrayStr(neighbors[2], validTokens)) 
{ 
    std::cout <<"true" 
} 

Вызывает ошибку во время выполнения «неисправность Сегментация: 11». Я не уверен, в чем проблема, и помощь будет приятной.

+0

Я советую вам включить в себя код 'using namespace std;', чтобы избежать 'std ::' постоянно. –

+1

@ Vkt0rS. Никогда не рекомендуйте это. ['using namespace std' - плохая практика программирования.] (http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice) – 0x499602D2

+0

@ 0x499602D2 - это плохая практика. заголовок, но не так плохо в .cpp – Sean

ответ

1
bool isMemberOfArrayStr(std::string str, std::string array[256]) 

распадается на

bool isMemberOfArrayStr(std::string str, std::string* array) 

Правильный прототип

bool isMemberOfArrayStr(std::string str, std::string (&array)[256]) 

но вы можете использовать std::array или std::vector, которые имеют лучшую (более интуитивный) синтаксис.

Тогда array->length() не 256, а длина первой строки массива.

Ваша функция может быть переписана (C++ 11):

bool isMemberOfArrayStr(const std::string& str, std::string (&array)[256]) { 
    ret = std::find(std::begin(array), std::end(array), str) != std::end(array); 
    return ret; 
} 

C++ 03:

bool isMemberOfArrayStr(const std::string& str, std::string (&array)[256]) { 
    ret = std::find(array, array + 256, str) != array + 256; 
    return ret; 
} 

И я думаю, вы должны удалить ret от этой функции в любом случае.

+0

Nice edit ... +1. – 0x499602D2

+0

Это похоже на но я могу сделать что-то не так. У меня все еще есть несколько ошибок: не-членная функция не может иметь квалификатор 'const', ни один член с именем 'begin' или 'end' в пространстве имен 'std', нет подходящей функции для call to 'isMemberOfArrayStr' ... isMemberOfArrayStr (соседи [2], validTokens)) { – bakman329

+0

@ bakman329: Добавлена ​​версия C++ 03 , предыдущим был C++ 11. (И я, хотя это был метод). – Jarod42

1
array->length(); 

Не имеет длины массива. Это длина первой std :: string в массиве. Рассмотрите возможность использования std :: vector of std :: string.

Если заказ не используется в контейнере, лучше выбрать std :: set (multiset).

+0

Как использовать вектор для решения проблемы? – 0x499602D2

+0

Будет использовать (sizeof (array)/sizeof (* array) bakman329

+0

@ bakman329, если использовать его внутри функции, ответьте «нет». Потому что «массив» в этом случае является простым указателем на std :: string. – alexolut

0
bool isMemberOfArrayStr(std::string str, std::string array[256]){ 
    for(int i=0;array->length()<10;i++){ 
        ^^^^^^^^^^ 
    if(array[i]==str){ 
     ret=true;//A global variable that will be reset to false after the function call 
    } 
    } 
    return ret; 
} 

Вы сравниваете постоянное значение. Вы выполняете цикл, только если array-> length() < 10, а затем выполняете его бесконечно много раз. Также

array->length() 

- длина первого элемента (если есть!) В массиве.

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