0
#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

4 に答える 4

4

std::string::operator[]c-string ではなく、文字を返します。

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

する必要があります

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

単一引用符は文字を表し、二重引用符は c-string を表します。

c-string は 型const char[]であり、暗黙的に に変換されconst char*ます。chars は c++ の整数型であるため、コンパイラが伝えていることは、ポインター (c-string "T") を整数型 ( によってchar返される) と比較できないということですoperator[]。ISO C++ でその比較を行うことができないと言われている理由は、標準化前の C++ の暗い残忍な時代に、整数型とポインターの等価性を比較するようなことができたからです。

于 2013-07-26T13:37:42.607 に答える
4

これは、std::string::operator[]が a への参照を返すのcharに対し、"T" などの文字列リテラルは aであり、比較const char[N]で減衰するためです。の要素を単一の文字とconst char*比較する場合は、一重引用符を使用します。line

if (line[i] == 'T' && line[i+1] == 'A' ....
于 2013-07-26T13:37:57.573 に答える
3

個々の文字を文字列全体と誤って比較しようとしています。

文字列で添字 ( []) 演算子を使用すると、1 文字になりますが、これ"T"文字列リテラルです。(はい、1文字しかありませんが。 )

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')

実際には、目に見えない 2 番目の文字、ヌル ターミネータもあります。

于 2013-07-26T13:36:45.563 に答える