std :: find не работает при использовании strdup - PullRequest
0 голосов
/ 25 января 2012

Я использую std::vector для хранения некоторых строк, позже я пытаюсь std::find их, но проходя через strdup, как показано в примере кода, он не работает, std::find возвращает последний, что означает, что он сделал не могу найти строку, но я вижу, что она есть, поскольку я получаю к ней доступ через функцию std::vector::at, и она отображается правильно. В чем проблема?

#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <stdint.h>
#include <string.h>

int main()
{
    std::vector<char*> signal_list;
    std::vector<char*>::iterator it;
    char *temp;
    char *temp2;

    signal_list.push_back("DDF_LTEsyn__CALLER");
    signal_list.push_back("DDF_LTEsyn__FFT_ctrl");
    signal_list.push_back("DDF_LTEsyn__IFFT_ctrl");
    signal_list.push_back("DDF_LTEsyn__ae_ctrl");
    signal_list.push_back("DDF_LTEsyn__cwp_ctrl");
    signal_list.push_back("DDF_LTEsyn__decision_ctrl");
    signal_list.push_back("DDF_LTEsyn__ovelap_ctrl");
    signal_list.push_back("DDF_LTEsyn__pilots_ctrl");
    signal_list.push_back("DDF_LTEsyn__pre_ctrl");
    signal_list.push_back("DDF_LTEsyn__rep_ctrl");

    temp2 = strdup(signal_list.at(3));

    printf("There is %s at position %d\n",temp2, 3);

    it = find(signal_list.begin(), signal_list.end(), temp2);

    printf("i found %s at position %d ",temp2, it - signal_list.begin());

}

Ответы [ 2 ]

8 голосов
/ 25 января 2012

Вы сравниваете адреса указателей, а не строки.Вы должны использовать std::vector<std::string> или std::find_if() и передать ему предикат, который может сравнивать указатели на символы.

Вот как вы можете сделать второй из них:

bool compare(const char *str1, const char *str2)
{
    return strcmp(str1, str2) == 0;
}

it = std::find_if(signal_list.begin(), signal_list.end(), std::bind2nd(std::ptr_fun(compare), tmp2));
3 голосов
/ 25 января 2012

Это потому, что находка сравнивает указатели.

Действие по умолчанию - сравнение значения указателя (не строкового значения).

Два варианта:
A : изменить

temp2 = strdup(signal_list.at(3));

// Change this to:

temp2 = signal_list.at(3);

Теперь он найдет совпадение по двум указателям.

B : переключиться на использование std :: string вместо char*

std::vector<char*>   signal_list;
char*                temp2;

// Change to:

std::vector<std::string>  signal_list;
std::string               temp2;

Теперь он будет использовать сравнение строк и будет вести себя так, как вы ожидаете.

ПРИМЕЧАНИЕ. Строковые литералы имеют тип char const*, а не char*. Поэтому хранить их в таком vector<char*> очень опасно. Любая попытка изменить их может привести к сбою в работе вашего приложения. По крайней мере, используйте vector<char const*>. Если вы смотрели ваши предупреждения, компилятор предупредит вас об устаревшем преобразовании из char const* в char*.

...