【问题标题】:Comparision between pointer and integer error [duplicate]指针和整数错误之间的比较[重复]
【发布时间】:2013-07-26 13:35:12
【问题描述】:
#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++ 禁止指针和整数之间的比较”。为什么?

【问题讨论】:

    标签: c++


    【解决方案1】:

    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*chars 是 c++ 中的整数类型,因此编译器告诉您的是,您无法将指针(c 字符串“T”)与整数类型(operator[] 返回的 char )。有人告诉您不能在 ISO C++ 中进行这种比较的原因是,在 C++ 标准化前黑暗残酷的日子里,您可以执行诸如比较整数类型和指针是否相等之类的事情。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案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')
        

        其实,它还有第二个你看不到的字符——空终止符

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-07-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-02-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多