【问题标题】:Given a string, remove a the repeating consecutive characters using c++给定一个字符串,使用 c++ 删除重复的连续字符
【发布时间】:2021-12-17 16:02:45
【问题描述】:
#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]='\0';
    cout<<ans<<endl;
    // for(int i=0; i<n; i++){
    //  cout<<ans[i];
    // }
    cout<<endl;
    return 0;
}

我无法使用简单的cout&lt;&lt;ans&lt;&lt;endl 打印变量ans。相反,我必须使用循环来打印它。这是为什么呢?

【问题讨论】:

  • "我无法打印变量 'ans'" 这是什么意思?
  • string ans; 后跟ans[0]=s[0]; 会导致未定义的行为。字符串 ansempty 并且任何和所有对它的索引都将超出范围。当您继续这样做时,这可能是您的问题的原因。使用例如ans += s[0] 追加字符。
  • 至于你的问题,除非是为了学校作业或类似用途std::unique
  • 是的,在字符串中附加字符有效。

标签: c++ string


【解决方案1】:

我不确定 C++,但 C 中的字符串是字符数组。所以假设你定义了一个这样的字符串:

char ans[]="Hello";

它将字符串以字符数组的形式存储,而ans将指向数组的第一个元素。

问题是数组指示符(用于数组的名称)被隐式转换为指针。所以对于字符串ans,它不是一个完整的容器来存储整个字符串Hello,而是指向一组按顺序排列的容器的第一块,这些容器包含Hell o 个字符。

所以如果你打印ans,那么它只会给出它所指向的容器的数据,而不是整个容器组。

虽然答案不是那么相关,但我希望这个概念会有所帮助。

【讨论】:

  • “所以如果你打印ans,那么它只会给出它所指向的容器的数据,而不是整个容器组。” - 非常令人困惑声明,很可能也是错误的。 operator&lt;&lt;std::ostream 具有用于打印空终止字节字符串的重载(作为 const char* 传入)
【解决方案2】:

这里

string ans;

ans 是一个长度为 0 的字符串。在下一行中,您已经通过尝试修改超出字符串末尾的元素来调用未定义的行为:

ans[0]=s[0];

您可以通过ans += character;ans.push_back(character); 向字符串添加字符。您无法通过std::cout 打印ans,因为您从未向其中添加字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    相关资源
    最近更新 更多