Учитывая строку, удалите повторяющиеся последовательные символы с помощью c

#c #string

Вопрос:

 #include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
    string s;
    getline(cin,s);
    int n= s.length();
    string ans;
    ans[0]=s[0];
    int j=1;
    for(int i=1; i<n; i  ){
        if(s[i]!=s[i-1]){
            ans[j]=s[i];
            j  ;
        }
    }
    ans[n]='';
    cout<<ans<<endl;
    // for(int i=0; i<n; i  ){
    //  cout<<ans[i];
    // }
    cout<<endl;
    return 0;
}
 

Я не могу напечатать переменную ans с помощью простого cout<<ans<<endl . Вместо этого я должен использовать цикл, чтобы распечатать его. Это почему?

Комментарии:

1. «Я не могу вывести переменную» ans «» что это значит?

2. string ans; непосредственно ans[0]=s[0]; за этим следует неопределенное поведение . Строка ans пуста , и любая индексация в ней будет запрещена. Вероятно, это и есть причина вашей проблемы, поскольку вы продолжаете это делать. Используйте, например ans = s[0] , для добавления символов.

3. Что касается вашей проблемы, если только она не предназначена для школьного задания или аналогичного использования std::unique .

4. Да, добавление символов в строку сработало.

Ответ №1:

Здесь

 string ans;
 

ans это строка длины 0 . Уже в следующей строке вы вызываете неопределенное поведение, пытаясь изменить элемент за пределами конца строки:

 ans[0]=s[0];
 

Вы можете добавлять символы в строку с помощью ans = character; или ans.push_back(character); . Вы не можете печатать ans через std::cout , потому что вы никогда не добавляете в него символ.

Ответ №2:

Я не уверен в C , но в C строки представляют собой массив символов. Итак, допустим, вы определяете строку следующим образом:

 char ans[]="Hello";
 

Он сохранит строку в виде массива символов, в то время как ans будет указывать на первый элемент массива.

Дело в том, что обозначения массива(имена, которые вы используете для массива) неявно преобразуются в указатель. Таким образом , для строки ans это не целый контейнер, в котором хранится вся строка Hello , а вместо этого он будет указывать на первый блок группы последовательно расположенных контейнеров, содержащих H e l l o символы по отдельности.

Поэтому, если вы напечатаете ans это, он выдаст только данные контейнера, на который он указывает, а не всю группу контейнеров.

Хотя ответ не так важен, я надеюсь, что концепция поможет.

Комментарии:

1. «Поэтому, если вы напечатаете ans так, это даст только данные контейнера, на который он указывает, вместо всей группы контейнеров». — это очень запутанное утверждение и, скорее всего, также неверное. operator<< of std::ostream имеет перегрузку для печати байтовых строк с нулевым завершением (переданных как const char* )