想用mfc实现获取edit control中的字符串,压缩字符串并输出结果,将数组输出到static text中

压缩规则如下:◆仅压缩连续重复出现的字符。例如:字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。◆压缩字段的格式为"字符重复的次数+字符"。例如... 压缩规则如下:◆仅压缩连续重复出现的字符。例如:字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。◆压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。我现在只会获取字符串,并输出到static text中。我的想法是先判断字符串前后i和i+1内容是否相同,相同的话给一个int值+1,然后进行下面的判断;如果不同,在数组中存下int值和字符串第i个位置的内容。这样的话,最后结果是一个数组,但是我不会怎么将数组输出到static text中,求大神指导下面是我写的代码 展开
 我来答
冯小气气
2019-01-30 · 知道合伙人IT服务行家
冯小气气
知道合伙人IT服务行家
采纳数:98 获赞数:239
八年编程经验,公司核心技术人员。

向TA提问 私信TA
展开全部

我觉得可以这样做:

  1. 再声明一个CString retStr,这个用来存放要输出的结果。声明一个int num表示重复个数并初始化为1

  2. 判断字符串前后i和i+1内容是否相同,相同的话num++,不同的话则去处理retStr(处理时,声明一个CString temp用来存储要压缩的当前内容;如果num大于1,那么temp.Format("%c%d", str[i], num);如果num=1,那么就temp.Format("%", str[i]);然后retStr+=temp;  最后再num=1开始下一次比较)

  3. 然后SetDlgItemText(STATIC_TEXT_ID, retStr).

	CString str, retStr;
int num  = 1;
CEdit *pBoxOne = (CEdit *)GetDlgItem(IDC_EDIT1);
pBoxOne->GetWindowText(str);
//m_Edit.GetWindowText(str);
for(int i = 0; i < str.GetLength(); i++)
{
if (str[i] == str[i + 1])
{
num++;

else
{
CString temp;
if (num > 1)
{
temp.Format("%d%c", num, str[i]);

else
{
temp.Format("%c", str[i]);
}
retStr += temp;
num = 1;
}
}
SetDlgItemText(IDC_STATIC, retStr);
    追问
    您好,为什么我运行这个程序会出现这个问题:

    error C2664: “void ATL::CStringT::Format(const wchar_t *,...)”: 不能将参数 1 从“const char [5]”转换为“const wchar_t *”
    追答
    if (num > 1)
    {
    temp.Format(_T("%d%c"), num, str[i]);

    else
    {
    temp.Format(_T("%c"), str[i]);
    }

    应该是字符集设置的问题,我用的多字符集,你用的Unicode字符集。上面Format部分代码改一下就好

    匿名用户
    2019-01-30
    展开全部
    	CString str;
    GetDlgItemTextW(IDC_EDIT1, str);
    wchar_t *s;
    wchar_t c='\0';
    int len = str.GetLength();
    s = new wchar_t[len + 1];
    memset(s, '\0', len + 1);
    int count = 1, s_pos=0;
    for (int i = 0; i < len; i++)
    {
    if (c == '\0')
    {
    c = str.GetAt(i);
    s[s_pos++] = c;
    }
    else
    {
    if (c == str.GetAt(i))
    {
    count++;
    if (i == len - 1)
    {
    s[s_pos++] = count + '0';
    }
    }
    else
    {
    if (count > 1)
    {
    s[s_pos++] = count + '0';
    c = '\0';
    }
    c = str.GetAt(i);
    s[s_pos] = c;
    s_pos++;
    count = 1;
    }
    }
    }
    s[s_pos] = '\0';
    SetDlgItemTextW(IDC_STATIC1, s);
    本回答被提问者采纳
    已赞过 已踩过<
    你对这个回答的评价是?
    评论 收起
    推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

    为你推荐:

    下载百度知道APP,抢鲜体验
    使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
    扫描二维码下载
    ×

    类别

    我们会通过消息、邮箱等方式尽快将举报结果通知您。

    说明

    0/200

    提交
    取消

    辅 助

    模 式