Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否从字符串中删除字符的第一个和最后一个实例?_C++ - Fatal编程技术网

C++ 是否从字符串中删除字符的第一个和最后一个实例?

C++ 是否从字符串中删除字符的第一个和最后一个实例?,c++,C++,我假设以下代码没有编译,因为我混合了正向迭代器和反向迭代器。为什么我不能这样混合呢?我怎样才能让它工作?我想删除字符串的第一个和最后一个引号,但保留所有内部引号 temp.assign(find(value.begin(), value.end(), '\"'), find(value.rbegin(), value.rend(), '\"')); 我甚至不能这样做。反向迭代器的意义是什么 value.erase(find(value.begin(), value.end(), '\"'));

我假设以下代码没有编译,因为我混合了正向迭代器和反向迭代器。为什么我不能这样混合呢?我怎样才能让它工作?我想删除字符串的第一个和最后一个引号,但保留所有内部引号

temp.assign(find(value.begin(), value.end(), '\"'), find(value.rbegin(), value.rend(), '\"'));
我甚至不能这样做。反向迭代器的意义是什么

value.erase(find(value.begin(), value.end(), '\"'));
value.erase(find(value.rbegin(), value.rend(), '\"'));

我认为问题在于erase需要一个正向迭代器,而不是反向迭代器。正如其他人所指出的,您可以根据find的结果使用.base()来转换它们


您也可以使用find_end来代替。

我认为问题在于erase需要一个正向迭代器,而不是反向迭代器。正如其他人所指出的,您可以根据find的结果使用.base()来转换它们


也可以使用find_end。

如果要使用reverse_itertators,请对其调用.base(),将其转换为基础迭代器类型。e、 g

value.erase(find(value.begin(), value.end(), '\"'));
value.erase(find(value.rbegin(), value.rend(), '\"').base());

可能会达到这个目的。

如果要使用反向迭代器,请将其上的.base()调用为基础迭代器类型。e、 g

value.erase(find(value.begin(), value.end(), '\"'));
value.erase(find(value.rbegin(), value.rend(), '\"').base());
可能就可以了。

赋值函数(无论
temp
的类型如何)需要 相同类型的两个迭代器。反向迭代器没有 与普通迭代器的类型相同。你可以在 使用上的
base()
函数的基础普通迭代器 反向迭代器,但要小心;这是一个落后的立场 反向迭代器指向。例如,如果你写

temp.assign( find( value.begin(), value.end(), '\"' ),
             find( value.rbegin(), value.rend(), '\"').base() );
,尾随的“将是结果字符串的一部分

这种特殊的行为通常是你在工作时想要的 将结果用作起始迭代器:

std::string( std::find( fn.rbegin(), fn.rend(), '.' ), fn.end() )
例如,将在最后一个 使用反向迭代器查找结果时 作为最终标准,您通常需要将其保存在 变量,并以某种方式“更正”它

最后,在使用 两次查找的结果定义了一个范围,如上面所述。如果 例如,您的文本中没有“
””
,您将以 相当于:

temp.assign( value.end(), value.begin() );
,这是行不通的

编辑: 例如,如果您不想要
字符,我认为 应采取以下措施:

//  Returns an empty string if there are not two " chars.
std::string
extractQuoted( std::string const& original )
{
    //  end points to one after the last '"', or begin() if no '"'.
    std::string::const_iterator end
        = std::find( original.rbegin(), original.rend(), '"' ).base();
    if ( end != original.begin() ) {
        -- end;    // Since we don't want the '"' in the final string
    }
    return std::string( std::find( original.begin(), end, '"' ), end );
}
(这是我脑子里想不出来的,所以不能保证,但应该是这样 让您从正确的方向开始。)

分配功能(无论
temp
的类型如何)需要 两个相同类型的迭代器。反向迭代器没有 与普通迭代器的类型相同 使用上的
base()
函数的基础普通迭代器 反向迭代器,但要小心;它位于 反向迭代器指向。例如,如果

temp.assign( find( value.begin(), value.end(), '\"' ),
             find( value.rbegin(), value.rend(), '\"').base() );
,尾随的“将是结果字符串的一部分

这种特殊的行为通常是你在工作时想要的 将结果用作起始迭代器:

std::string( std::find( fn.rbegin(), fn.rend(), '.' ), fn.end() )
例如,将在最后一个
。使用反向迭代器查找结果时 作为最终标准,您通常需要将其保存在 变量,并以某种方式“更正”它

最后,在使用 两次查找的结果定义了一个范围,如上面所述。如果 例如,您的文本中没有“
””
,您将以 相当于:

temp.assign( value.end(), value.begin() );
,这是行不通的

编辑: 例如,如果您不想要
字符,我认为 应采取以下措施:

//  Returns an empty string if there are not two " chars.
std::string
extractQuoted( std::string const& original )
{
    //  end points to one after the last '"', or begin() if no '"'.
    std::string::const_iterator end
        = std::find( original.rbegin(), original.rend(), '"' ).base();
    if ( end != original.begin() ) {
        -- end;    // Since we don't want the '"' in the final string
    }
    return std::string( std::find( original.begin(), end, '"' ), end );
}
(这是我脑子里想不出来的,所以不能保证,但应该是这样 从正确的方向开始。)

您也可以使用

value.erase(0, value.find('\"') + 1);
value.erase(value.rfind('\"'), value.size());
假设字符串始终包含至少两个
s

,您也可以使用

value.erase(0, value.find('\"') + 1);
value.erase(value.rfind('\"'), value.size());
假设字符串始终包含至少两个
s

这个怎么样

void stripLeadingAndTrailingQuotes(std::string& s) {
    if (s[0] == '\"')
        s.erase(0, 1);
    size_t last = s.length() - 1;
    if (s[last] == '\"')
        s.erase(last, 1);
}
迭代器是有效的,但我认为上面的内容更具可读性。

这个怎么样

void stripLeadingAndTrailingQuotes(std::string& s) {
    if (s[0] == '\"')
        s.erase(0, 1);
    size_t last = s.length() - 1;
    if (s[last] == '\"')
        s.erase(last, 1);
}

迭代器是有效的,但我认为上面的内容更具可读性。

你可以复制一个
std::string stripped(str.begin()+1,str.end()-1)
并仅在begin和end有效且包含引号时断言或执行引号可能不是第一个或最后一个字符,很抱歉没有说清楚。@user814628更不用说如果你给函数传递一个空字符串会发生什么。请注意,
assign(it1,it2)
将放弃所有直到
it1
的内容,以及所有从
it2
开始的内容。如果您只想删除
it1
it2
处的字符,这不是您想要的。您可以只制作一个副本
std::string stripped(str.begin()+1,str.end()-1)
,并仅在begin和end有效且包含引号时断言或执行引号可能不是第一个或最后一个字符,很抱歉没有说清楚。@user814628更不用说如果你给函数传递一个空字符串会发生什么。请注意,
assign(it1,it2)
将放弃所有直到
it1
的内容,以及所有从
it2
开始的内容。如果您只想删除
it1
it2
处的字符,这不是您想要的。使用反向迭代器查找某个事件的最后一次发生是完全有效的,而且是惯用的。@JamesKanze是的,我想您是对的,我不知道.base()。已编辑。使用反向迭代器查找某事物的最后一次出现是完全有效的和惯用的。@JamesKanze是的,我认为你是对的,我不知道.base()。编辑过,也可能没有。我怀疑他不想在最后一个字符串中包含
”,或者可能不需要。我怀疑他不想在最后一个字符串中包含
。首先,这是一个危险的假设。其次,您的代码将只删除
字符;在