0

我正在尝试在这里编写基本上从字符串读取的 alil 函数。它每三个字符读取一次,并使用前置条件(if 语句)对其进行评估。如果满足条件,它将用新的三个字母替换这三个字母。然后它将输出新字符串。

我尝试编写代码,但似乎无法正确逻辑。程序运行,但它没有打印出任何东西。不要介意函数名称和不准确之处。我只是在做一个示例函数来测试它。

string amino_acids(string line)
{
    string acid;
    string acids;
    string newline;
    for( int i= 0; i < line.length(); i++)
    {
        acid = line[i];
    }
    for (int i = 0; i < 3; i++)
    {
        acids = acid[i];
        if(acids == "GUU")
        {
            acids = "ZAP";  
        }
        newline = acids;
    }
    cout << "Acids: " <<newline <<endl;
    return newline;
}
4

4 回答 4

1

std::string使用运算符索引 a会[]产生 a char,而对于它恰好是operator=字符串的重载。

即使您按照我认为您的意图循环(正如对问题的评论所提到的,您可能不是),因为酸(取单个字符的值)永远不会等于您的三个字符串重新比较它。因此,不会执行替换。

做你想做的事,试试这样的事情:

for (int i = 0; i + 3 < line.length(); i += 3) // counting by 3 until end of line
{
    if (line.substr(i, 3) == "GUU")            // if the substring matches
    {
        line.assign("ZAP", i, 3);              // overwrite it with new substring
    }
}
return line;
于 2013-03-21T02:32:03.533 回答
1
for( int i= 0; i < line.length(); i++)
    acid = line[i];

假设行包含“abcd”,此循环将执行以下操作:

acid = 'a';
acid = 'b';
acid = 'c';
acid = 'd';

只有最后的分配有任何持久的影响。如果您实际上需要将三个字符从 line 转换为 acid - 您可能希望使用+=将字符添加到acid中,而不是=. 但是,如果你像这样遍历所有行,你最终会做acid = line;. 我假设您想要更多类似的东西acid = line.substr(0, 3)

for (int i = 0; i < 3; i++)
{
     acids = acid[i];

这将崩溃。 acid绝对是单个字符串,并且您正在索引第二次acid[1]acid[2]第三次迭代。在学习 C++ 时,您可能应该使用.at(i)which 在您尝试使用无效索引时会引发异常 - 您可以捕获异常并且至少有一些问题的迹象。照原样,这是未定义的行为。

要使用 at,您需要一个try/catch块...基本形式是:

int main()
try
{
    ...your code in here...
    some_string.at(i);
}
catch (const std::exception& e)
{
    std::cerr << "caught exception: " << e.what() << '\n';
}

更一般地说,尝试在std::cout整个代码中添加一些语句,以便您知道变量实际具有的值......您很容易看到它们不是您所期望的。或者,使用交互式调试器并观察每个语句执行的影响。

于 2013-03-21T02:34:48.060 回答
0

从您的描述中阅读,您想要这样的东西

//note below does not compile, its just psuedo-code

string amino_acid(const string& sequence){
  string result = sequence; //make copy of original sequence
  For i = 0 to sequence.length - 3 
    string next3Seq = sequence(i,3); //grab next 3 character from current index
    If next3Seq == 'GUU' //if the next next three sequence is 'GUU'
      then result.replace(i,3,'ZAP'); //replace 'GUU' with 'ZAP'
    EndIf
  EndFor
  return result;   
}

您可以将其用作编码的开始。祝你好运。

于 2013-03-21T02:42:03.380 回答
0

根据我对你的问题的理解。我写了一些代码。请看下面

string acids;
string newLine;
int limit=1;
for(int i=0;i<line.length();i++)
{
    acids=acids+line[i];
    if(limit==3)//Every 3 characters
    {
      if(acids == "GUU")
        {
            acids = "ZAP";  
        }       
        limit=1;
        acids=""
        newline=newline+acids;
    }
limit++;
    return newline;
}
于 2013-03-21T02:43:57.443 回答