我更喜欢与std::string
合作,但我想知道这里出了什么问题。
我无法理解为什么std::find
无法正常处理类型T**
,即使指针算法正确地对它们起作用。喜欢 -
std::cout << *(argv+1) << "\t" <<*(argv+2) << std::endl;
但对于T*[N]
类型,它可以正常工作。
#include <iostream>
#include <algorithm>
int main( int argc, const char ** argv )
{
std::cout << *(argv+1) << "\t" <<*(argv+2) << std::endl;
const char ** cmdPtr = std::find(argv+1, argv+argc, "Hello") ;
const char * testAr[] = { "Hello", "World" };
const char ** testPtr = std::find(testAr, testAr+2, "Hello");
if( cmdPtr == argv+argc )
std::cout << "String not found" << std::endl;
if( testPtr != testAr+2 )
std::cout << "String found: " << *testPtr << std::endl;
return 0;
}
参数传递:Hello World
输出:
Hello World
找不到字符串
找到的字符串:您好
感谢。
答案 0 :(得分:1)
比较char const*
金额的类型以指向地址。 "Hello"
的地址保证不同,除非您将其与字符串文字"Hello"
的另一个地址进行比较(在这种情况下,指针可能比较相等)。您的compare()
函数会比较指向的字符。
答案 1 :(得分:1)
在第一种情况下,您要比较指针值本身而不是它们指向的内容。常量“Hello”与argv
的第一个元素的地址不同。
尝试使用:
const char ** cmdPtr = std::find(argv+1, argv+argc, std::string("Hello")) ;
std::string
知道比较内容而不是地址。
对于数组版本,编译器可以将所有文字折叠成一个文字,因此每次在整个代码中都看到“Hello”时,它实际上是相同的指针。因此,比较
中的相等性const char * testAr[] = { "Hello", "World" };
const char ** testPtr = std::find(testAr, testAr+2, "Hello");
产生正确的结果