我使用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());
}
答案 0 :(得分:8)
您正在比较指针地址,而不是字符串。您应该使用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));
答案 1 :(得分:3)
那是因为find正在比较指针。
默认操作是比较指针值(而不是字符串值)。
两个选项:
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*
的弃用转换。