#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<<
ofstd::ostream
имеет перегрузку для печати байтовых строк с нулевым завершением (переданных какconst char*
)