2010-08-30 98 views
5

我想比较字符文字与字符串的第一个元素,以检查文件中的注释。为什么使用char?我想把它变成一个函数,它接受评论的字符var。我不想允许一个字符串,因为我想将其限制为单个字符的长度。将字符文字与C++中的Std :: String进行比较

考虑到这一点,我认为简单的方法是解决字符并将其传递给std :: string的比较函数。但是这给了我意想不到的结果。

我的代码如下:

#include <string> 
#include <iostream> 

int main (int argc, char *argv[]) 
{ 
    std::string my_string = "bob"; 
    char my_char1 = 'a'; 
    char my_char2 = 'b'; 

    std::cout << "STRING : " << my_string.substr(0,1) << std::endl 
     << "CHAR : " << my_char1 << std::endl; 
    if (my_string.substr(0,1).compare(&my_char1)==0) 
    std::cout << "WOW!" << std::endl; 
    else 
    std::cout << "NOPE..." << std::endl; 

    std::cout << "STRING : " << my_string.substr(0,1) << std::endl 
     << "CHAR : " << my_char2 << std::endl; 
    if (my_string.substr(0,1).compare(&my_char2)==0) 
    std::cout << "WOW!" << std::endl; 
    else 
    std::cout << "NOPE..." << std::endl; 

    std::cout << "STRING : " << my_string << std::endl 
     << "STRING 2 : " << "bob" << std::endl; 
    if (my_string.compare("bob")==0) 
    std::cout << "WOW!" << std::endl; 
    else 
    std::cout << "NOPE..." << std::endl; 
} 

给我...

STRING : b 
CHAR : a 
NOPE... 
STRING : b 
CHAR : b 
NOPE... 
STRING : bob 
STRING 2 : bob 
WOW! 

为什么函数认为子串和字符是不一样的。正确比较字符和std :: string vars的最简单方法是什么?

(短咆哮我的问题的避免叙 ....随意跳过)
当我说最短我的意思是出了编码口才的愿望。请注意,这不是一个家庭作业问题。我是一名化学工程博士候选人,并且正在编码,作为独立研究的一部分。当我问到效率问题时,我最后一个问题中的一个被用户msw重新归类为“家庭作业”(他也发表了一个讽刺评论),我认为这是滥用的边界。我的代码可能会或可能不会被其他人重用,但我正在努力使其易于阅读和维护。我也有一个奇怪的愿望,尽可能使我的代码尽可能高效。因此,关于效率和口才的问题。

回答

14

这样做:

if (my_string.substr(0,1).compare(&my_char2)==0) 
因为你“欺骗”

都不行字符串认为它获得了一个指向空字符串C的指针。这将有奇怪的影响,包括崩溃你的程序。相反,只需使用普通的平等字符串的第一个字符用my_char比较:

if (my_string[0] == my_char) 
    // do stuff 
+5

在尝试访问'my_string [0]'之前,不要忘记检查'0 2010-08-30 19:39:23

3

可以使用operator []的字符串比较它的单个字符

// string::operator[] 
#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    string str ("Test string"); 
    int i; char c = 't'; 
    for (i=0; i < str.length(); i++) 
    { 
     if (c == str[i]) { 
      std::cout << "Equal at position i = " << i << std::endl; 
     } 
    } 
    return 0; 
} 
1

前两个电话进行比较的行为是完全依赖于什么随机存储器内容如下每个字符的地址。您正在调用basic_string::compare(const char*),并且此处的参数被假定为C字符串(以空字符结尾),而不是单个字符。 compare()调用会比较你想要的字符,然后在该字符之后的内存中的所有内容到达下一个0x00字节,并且使用std :: string。

Otoh < <运算符确实具有适当的字符输入重载,因此您的输出不反映您实际上在这里比较的内容。

将decls和b转换为const char[] a = "a";,你就会得到你想要发生的事情。

4

为什么不在你的字符串上使用索引操作符?它将返回一个字符类型。

if (my_string[0] == my_char1) 
1

漂亮的标准,C++中的字符串以空字符结尾;字符不是。所以通过使用标准比较方法,你真的检查是否“b \ 0”=='b'。

我用这一点,得到了所需的输出:

if (my_string.substr(0,1).compare(0, 1, &my_char2, 1)==0) 
    std::cout << "WOW!" << std::endl; 
else 
    std::cout << "NOPE..." << std::endl; 

这是什么意思是开始于子串的0位置,使用1的长度,并将其与长度比较我的性格参考1. Reference

+1

C++中的字符串不是空终止的。它们在C中以null结尾,因为它们实际上是指向char的指针。 – 2010-08-30 19:33:43

+0

@Draco:'std :: string'不需要以null结尾(尽管这在0x中改变),但是在C++标准中仍然有很多地方假定以null结尾的char数组。正如这个问题所示,在'std :: string'内包含一些方法。 – 2010-08-30 20:44:31

相关问题