Строка не меняется - PullRequest
       3

Строка не меняется

0 голосов
/ 08 декабря 2018
string a;
string seq="AACCGGTT";

for (int i=0;i<seq.length();i++)
{
    if (seq[i]=='T')
    {
        a[i]='U';
        cout<<"i have turned: "<<seq[i]<<" into : "<<a[i]<<endl;
    }
    else
    {
        a[i]=seq[i];
        cout<<"i have turned: "<<seq[i]<<" into : "<<a[i]<<endl;
    }
}

cout<<"here: "<<a<<endl;

**

  • когда я запускаю эту часть большого кода, он печатает

, я превратил: A в: A

Я превратил: A в: A

Я превратил: C в: C

Я превратил: G в: G

Я превратил: G в:G

я превратил: T в: U

я превратил: T в: U

здесь:

и он не возвращаетзначение

**

Ответы [ 4 ]

0 голосов
/ 08 декабря 2018

В вашем коде a создается следующий конструктор по умолчанию.Например, таблица 63 в 21.4.2 из n3337 (черновик) гласит:

explicit basic_string(const Allocator& a = Allocator());

data(): a non-null pointer that is copyable and can have 0 added to it
size(): 0
capacity(): an unspecified value

Поэтому a[i] в вашем коде может показать что-то неопределенное поведение.

IПодумайте, что самый простой способ заменить определенный символ - это использовать std::replace следующим образом.

DEMO

#include <iostream>
#include <string>
#include <algorithm>

int main()
{    
    std::string seq="AACCGGTT";
    std::replace(seq.begin(), seq.end(), 'T', 'U');

    std::cout << seq << std::endl; // "AACCGGUU"

    return 0;
}
0 голосов
/ 08 декабря 2018

Поскольку вы не установили размер вашей строки a, она зарезервировала столько места, сколько обеспечивает оптимизация небольших строк вашей реализации.(Но обратите внимание, что даже в этом случае индексирование в строку перед ее инициализацией является неопределенным поведением.)

Это можно исправить, установив размер a примерно так:

string seq="AACCGGTT";
string a;
a.resize(seq.size();
0 голосов
/ 08 декабря 2018

Оператор индекса [] не добавляет ничего к a, он может предоставить вам доступ только к существующим символам в a.Поскольку в a нет символов, каждый из вас использует [] на a, это неопределенное поведение .

Чтобы добавить что-то к a, вы можете либоиспользуйте a.append('U'); или a += 'U';.

Альтернативой может быть инициализация a как копия seq вместо пустой строки.Тогда вы можете безопасно использовать оператор индекса на нем, как вы пытаетесь прямо сейчас.

Вы также можете рассмотреть функцию replace, как описано здесь .

0 голосов
/ 08 декабря 2018

Изменить a+=seq[i] вместо этого проблема [i] = seq [i] (конечно, + = 'U' to) - это [i], не может быть частью причины a пусто, когда вы устанавливаете [i] вВаш цикл a [i] представляет собой разную переменную для компилятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...