指针和整数错误之间的比较

时间:2013-07-26 13:35:13

标签: c++

#include <iostream>
#include <string>
#include <map>
using namespace std;

int main()
{
    map<string, string> opposites;
    opposites["A"] = "T";
    opposites["T"] = "A";
    opposites["C"] = "G";
    opposites["G"] = "C";
    string line = "AGATTATATAATGATAGGATTTAGATTGACCCGTCATGCAAGTCCATGCATGACAGC";
    int promoter_index,i;
    for (i = 0; i < line.length();i++)
    {
        if (line[i] == "T" && line[i+1] == "A" && line[i+2] == "T" && line[i+3] == "A" && line[i+4] == "A" && line[i+5] == "T")
            promoter_index = i;
    }
    int start_of_sequence = promoter_index + 10;
    cout << promoter_index;

}

我试图在“行”中找到TATAAT,但是当我尝试比较它时说“ISO C ++禁止指针和整数之间的比较”。为什么呢?

4 个答案:

答案 0 :(得分:4)

std::string::operator[]返回一个字符,而不是一个c字符串。

if (line[i] == "T" && line[i+1] == "A"...

应该是

if (line[i] == 'T' && line[i+1] == 'A'...

单引号表示一个字符,而双引号表示一个c字符串。

c-strings的类型为const char[],隐式转换为const char*char是c ++中的整数类型,因此编译器告诉你的是你不能将指针(c字符串“T”)与整数类型(由返回的char进行比较。 operator[])。你被告知你无法在ISO C ++中进行这种比较的原因是,在预标准化C ++的黑暗,残酷的日子里,你可以做比较整数类型和指针的相等性。

答案 1 :(得分:4)

这是因为std::string::operator[]返回对char的引用,而字符串文字(如“T”)是const char[N],在比较中衰减到const char* 。如果要将line的元素与单个字符进行比较,请使用单引号:

if (line[i] == 'T' && line[i+1] == 'A' ....

答案 2 :(得分:3)

您错误地尝试将各个字符与整个字符串进行比较。

在字符串上使用下标([])运算符会为您提供单个字符,但"T"字符串字面值。 (是的,即使它只有一个字符。

line[i] == "T"
/*****/   /***/
//  ^       ^
//  |       |
// char     |
//     char const[2]

字符文字由单个 - 引号分隔,所以你打算写:

line[i] == 'T'

所以,在上下文中:

if (line[i]   == 'T'
 && line[i+1] == 'A'
 && line[i+2] == 'T'
 && line[i+3] == 'A'
 && line[i+4] == 'A'
 && line[i+5] == 'T')

实际上,它还有一个你看不到的第二个字符 - null终止符

答案 3 :(得分:0)

要使程序编译,只需将文字更改为''。例如line[i] == 'T'

或者,您可以使用strcmp(&line[i], "T") != 1来比较两个字符的值是否相等。