#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 ++禁止指针和整数之间的比较”。为什么呢?
答案 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
来比较两个字符的值是否相等。