无法从不区分大小写的字符串中提取双精度数?

Posted

技术标签:

【中文标题】无法从不区分大小写的字符串中提取双精度数?【英文标题】:cannot extract a double from a case insensitive string? 【发布时间】:2011-10-09 13:28:59 【问题描述】:

我试图想出一个不区分大小写的字符串,我在网上找到了以下内容

http://www.gotw.ca/gotw/029.htm

所以基本上我想出一个不区分大小写的字符串的代码如下

struct ci_char_traits : public std::char_traits<char> 

    static bool eq( char c1, char c2 )
     return toupper(c1) == toupper(c2); 

    static bool ne( char c1, char c2 )
     return toupper(c1) != toupper(c2); 

    static bool lt( char c1, char c2 )
     return toupper(c1) <  toupper(c2); 

    static int compare(const char* s1, const char* s2, size_t n )
     return memicmp( s1, s2, n ); 

private:
    static int memicmp(const void *s1, const void *s2, size_t n) 

        if (n != 0) 
            const unsigned char *p1 = (const unsigned char *)s1, *p2 = (const unsigned char *)s2;
            do 
                if (toupper(*p1) != toupper(*p2))
                    return (*p1 - *p2);
                p1++;
                p2++;
             while (--n != 0);
        
        return 0;
    
;

// case insensitive string type definition
typedef std::basic_string<char, ci_char_traits> ci_string;

// provide standard output for case insensitive string
template<typename char_type, typename traits_type, typename allocator_type>
inline std::basic_ostream<char_type, traits_type>&
operator<<(std::basic_ostream<char_type, traits_type>& os,
           const std::basic_string<char_type, ci_char_traits, allocator_type>& str) 
    return std::__ostream_insert(os, str.data(), str.size());

所以类型定义是字符串。现在我遇到的问题是,我无法让一个函数与这个自定义字符串一起使用,因为它与常规字符串一起使用。下面的模板函数从字符串中获取一个值,但是

template <typename T, class string_type, typename counter_type>
T stream_cast(const string_type& s) 

  typedef typename string_type::value_type char_type;
  typedef typename string_type::traits_type traits_type;

  typename std::basic_istringstream<char_type, traits_type> iss(s);

  T x;
  char c;
  if (!(iss >> x) || iss.get(c))
     cout<<"*** ERROR *** Bad Conversion!"<<endl;
  return x;
 

我调用这个函数来从一个字符串中获取一个双精度值,如下所示:

ci_string str("2.0");
double test = stream_cast<double>(str);

但是我对不区分大小写字符串的定义有问题,因为通过运算符对流对象的评估!总是失败(行 !(iss >> x) 对于这个字符串类型总是正确的)。

有人知道我为什么会遇到这个问题吗?提前感谢您抽出宝贵时间阅读这篇长文。

【问题讨论】:

我想所有的基本格式化操作都是只为char_traits&lt;char&gt; 定义的,所以这些重载根本不存在。您可以通过使用普通字符串进行 I/O 来解决此问题,只需从另一个字符串构造一个字符串(例如 ci_string is(s.begin(), s.end()); 等)。 有趣的是:使用 VC++ 2010 编译的代码按预期运行,但使用 gcc 4.5.3 编译时遇到上述问题。 我又花了 2 个小时试图找出发生这种情况的原因。 badbit 是为这种类型的字符串设置的,但我不知道为什么。我尝试编写自己的函数 basic_istream<_chart _traits>::_M_extract 版本,但在某些时候我停止了,因为我无法访问 basic_istream 类的受保护成员。这让我发疯... =/ 【参考方案1】:

您编写了自定义输出运算符“operator>>”,但没有编写输入运算符“operator

这很好用:

ci_string str("2.0");
std::cout << str << std::endl;

因为运营商>>.

但是

std::cin >> str

没有。

【讨论】:

感谢马歇尔的回复。我将尝试回到那段代码并添加运算符。我自己也想不通。

以上是关于无法从不区分大小写的字符串中提取双精度数?的主要内容,如果未能解决你的问题,请参考以下文章

== 在 PHP 中是区分大小写的字符串比较吗?

是否存在不区分大小写的 string.Replace 替代方法?

Java UUID是不是区分大小写

使用 QRegExp 的双精度值的正则表达式

sql语句区分大小写吗

matlab