C++ 重载运算符>&燃气轮机;用于不区分大小写的字符串

C++ 重载运算符>&燃气轮机;用于不区分大小写的字符串,c++,case-insensitive,istream,C++,Case Insensitive,Istream,给定ci_字符串的定义,我们将如何实现操作符>?我尝试使用std::read,但它似乎不起作用(也就是说,gcount()正确计算输入的字符数,但没有输出) #包括 #包括 #包括 //ci_字符串定义在这里 std::istream和运算符>>(std::istream和in、ci_字符串和str) { 返回in.read(&*str.begin(),4); } int main() { ci_字符串测试_str; 标准::cin>>测试; std::cout std::istream&am

给定ci_字符串的定义,我们将如何实现操作符>?我尝试使用std::read,但它似乎不起作用(也就是说,gcount()正确计算输入的字符数,但没有输出)

#包括
#包括
#包括
//ci_字符串定义在这里
std::istream和运算符>>(std::istream和in、ci_字符串和str)
{
返回in.read(&*str.begin(),4);
} 
int main()
{
ci_字符串测试_str;
标准::cin>>测试;
std::cout

std::istream& operator>>(std::istream& in, ci_string& str)
{
    std::string tmp;
    in >> tmp;
    str.assign( tmp.begin(), tmp.end() ); 
    return in;
} 
怎么样

std::istream& operator>>(std::istream& in, ci_string& str)
{
    std::string tmp;
    in >> tmp;
    str.assign( tmp.begin(), tmp.end() ); 
    return in;
} 

太好了!谢谢你,@Daniel Frey。如果你要走这条路,我会使用
str.assign(tmp.begin(),tmp.end())
,而不是使用
c_str
的解决方案。为什么要让目标重新计算长度,而你已经知道了呢?@JamesKanze它的可读性较差,但这是一个好主意。我只是想知道今天的编译器是否足够聪明,能够在上面的代码中直接从
tmp
中提取长度作为优化。@DanielFrey less readable?只适用于不习惯使用标准库的人——与
c_str
方法不同,它不涉及任何特殊的字符串函数,也不涉及过时的c字符串(当我看到
c_str
时,我读到了“遗留接口”。对我来说,在其他地方使用它是一种混淆。)至于优化,这是不可能的。(就此而言,如果我正在读取一个以二进制模式打开的文件,而该文件恰好包含
'\0'
,并且
isspace('\0')
在嵌入区域设置中返回false,则您的解决方案是不正确的。)@JamesKanze好的,更新了答案。太糟糕了,
std::string
ci_string
之间的一些转换/赋值不能自动工作,如果能够直接分配
std::string
会更好,甚至可能使用
std::move(tmp)
:(太好了!谢谢你,@Daniel Frey。如果你要走这条路,我会使用
str.assign(tmp.begin(),tmp.end())
,而不是使用
c_str
的解决方案。为什么要让目标重新计算长度,而你已经知道了呢?@JamesKanze它的可读性较差,但这是一个好主意。我只是想知道今天的编译器是否足够聪明,能够在上面的代码中直接从
tmp
中提取长度作为优化。@DanielFrey less readable?只适用于不习惯使用标准库的人——与
c_str
方法不同,它不涉及任何特殊的字符串函数,也不涉及过时的c字符串(当我看到
c_str
时,我读到了“遗留接口”。对我来说,在其他地方使用它是一种混淆。)至于优化,这是不可能的。(就此而言,如果我正在读取一个以二进制模式打开的文件,而该文件恰好包含
'\0'
,并且
isspace('\0')
在嵌入区域设置中返回false,则您的解决方案是不正确的。)@JamesKanze好的,更新了答案。太糟糕了,
std::string
ci_string
之间的一些转换/赋值不能自动工作,如果能够直接分配
std::string
会更好,甚至可能使用
std::move(tmp)
:(