一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 980|回复: 9
收起左侧

[字符串] 如何将一个字符令为空?

[复制链接] |试试Instant~ |关注本帖
Snake_tomoyo 发表于 2015-1-4 00:46:55 | 显示全部楼层 |阅读模式

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
在做removeDuplicate那道题的时候遇到的问题,我尝试把压缩后的字符串后面剩下的全部令为'\0',但发现在输出结果中却还是会显示出来。。。我估计是因为我include<string>而不是<cstring>,但用cstring的话没法cin和cout,求解正确方法TAT
excellent5 发表于 2015-1-5 23:13:25 | 显示全部楼层
你把你代码贴一下把
回复 支持 反对

使用道具 举报

 楼主| Snake_tomoyo 发表于 2015-1-7 01:37:10 | 显示全部楼层
#include<iostream>
#include<string>

using namespace std;

string removeDuplicate(string s){
        if (s.length() < 1) return s;
        int i = 1, j = 1;
        for (i = 1; i < s.length(); i++){
                if (s != s[i - 1])
                {
                        s[j] = s;
                        j++;
                }
        }
        s[j] = '\0';
        /*
        for (; j < s.length(); j++)
        {
                s[j] = '\0';
        }
        */
        return s;
}

void main(){
        string s;
        cin >> s;
        cout << removeDuplicate(s) << endl;
        system("pause");
}

当输入是asdddf时,输出为asdfaf,最后两位不知道如何令为空……/**/中的语句也试过,还是不行





还有顺便请教一下,指针在定义时必须初始化么?我印象中不用啊。。。但是每次都要报错。。
node* init(int a[], int n){
        node *head, *p;
        for (int i = 0; i < n; i++){
                node *nd = new node();
                nd->data = a;
                if (i == 0){
                        head = p = nd;
                        continue;
                }
                p->next = nd;
                p = nd;
        }
        return head;
}

1>d:\c++\projects\cc2.1\cc2.1\源.cpp(24): error C4703: 使用了可能未初始化的本地指针变量“head”
1>d:\c++\projects\cc2.1\cc2.1\源.cpp(21): error C4703: 使用了可能未初始化的本地指针变量“p”

回复 支持 反对

使用道具 举报

bbsbbstry 发表于 2015-1-7 14:43:12 | 显示全部楼层
感觉你用个j标示然后还原地合并这样逻辑有点复杂啊,直接再开个string不好么?然后比较不相同就赋值,相同就++。
回复 支持 反对

使用道具 举报

 楼主| Snake_tomoyo 发表于 2015-1-7 14:47:00 | 显示全部楼层
bbsbbstry 发表于 2015-1-7 14:43
感觉你用个j标示然后还原地合并这样逻辑有点复杂啊,直接再开个string不好么?然后比较不相同就赋值,相同 ...

再开个string是比较方便,但空间复杂度就翻倍了啊。有的题目里面限制了只用一个string的所以我才直接这么做。
回复 支持 反对

使用道具 举报

bbsbbstry 发表于 2015-1-7 14:54:30 | 显示全部楼层
Snake_tomoyo 发表于 2015-1-7 14:47
再开个string是比较方便,但空间复杂度就翻倍了啊。有的题目里面限制了只用一个string的所以我才直接这么 ...

非这么做的话感觉问题出在第一个循环。另外结合题本身的要求就可以,不同的题目不同的环境要求的空间复杂度本身就不一样,没有必要人为复杂化
回复 支持 反对

使用道具 举报

南若冲 发表于 2015-1-7 16:28:11 | 显示全部楼层
改了下,看看,好像可以满足你的要求。。。。
#include<iostream>
#include<string>
using namespace std;

int main()
{
        string str;
        cin >> str;
        int j = 0;
        for(int i = 0; i < str.length()-1; i++)
        {
                if(str[i] != str[i+1])
                {
                        str[j] = str[i];                       
                        j++;  
                }
        }
        for(int i = 0; i < j ; i++)
        {
                cout << str[i];
        }
        cout << str[str.length()-1] << endl;

        system("pause");
        return 0;
}

还有就是指针一定要初始化的!
另外s[j] = s; 你这行代码本来就是错的,数组怎么给字符赋值?
PS这道题不是要求用链表吗?_?
回复 支持 反对

使用道具 举报

 楼主| Snake_tomoyo 发表于 2015-1-8 00:50:43 | 显示全部楼层
南若冲 发表于 2015-1-7 16:28
改了下,看看,好像可以满足你的要求。。。。
#include
#include

我才发现在贴的时候自动把s换成格式了。。。

        for (i = 1; i < s.length(); i++){
                if (s != s[i - 1])
                {
                        s[j] = s;
                        j++;
                }
        }

不知道这次复制过来还对不对。。

所以只能直接输出前j位而不能设定一个能被辨认的结尾么?
这道题有很多版本啦,链表的是另外一个。
回复 支持 反对

使用道具 举报

王可雪 发表于 2015-1-8 12:53:14 | 显示全部楼层
char*是'\0' terminate的。string不是,可以用substr或者+‘\0'同时输出c_str(),或者用erase,或者replace
回复 支持 反对

使用道具 举报

mrdanding 发表于 2015-1-9 10:07:51 | 显示全部楼层
你把不要的字符往后放就行,然后根据长度截取以下再返回。。
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-9 18:09

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表