开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 523|回复: 4
收起左侧

[已解决] c++转c

 关闭 [复制链接]

结帖率:92% (190/207)
发表于 2022-11-3 21:16:13 | 显示全部楼层 |阅读模式   广东省东莞市
10精币
一道题,只有c++的代码,希望坛友帮忙转成 c语言的


给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
————————————————
版权声明:本文为CSDN博主「胖鲁」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_37697423/article/details/106408855

  
// 实现思路: 通过遍历字符串,先找出字符重复的次数n,存放给一个变量,
//遇到"[",通过递归,找出"]"之前需要重复的字符s,通过循环n次 得到重复字符,保存在全局的字符串结果中


function showStr (s,index){
let num = 0; // 字符重复上午次数
let countStr = ' '; // 最终的字符串结果
while (index<=s.length-1){

if (Number (s[index])>=0){ // 数字为字符重复的次数
num = Number (num+s[index]); // 次数大于9后,则需要两个及以上位置字符串拼接在一起,再转为字符串

}else if (s[index]== ' ['){
let temp = showStr (s,index+1); // 使用递归查找[]内是否仍有[]的存在,
index =temp[0];
for (let i=0;i<num;i++){
countStr+=temp[1]
}
num = 0; // 当一次递归查找完成后,重复次数清0,
}else if (s[index]== ' ]'){
return [index,countStr]; // 在本次查找结束后,返回当前下标 (循环继续执行的下标条件),返回本轮查找到的[]中的字符
}else{
countStr += s[index]; //不满足上面重复条件 就输出字符
}
index++;
}
return countStr;
}

console.log (showStr ( ' 3[a2[bc]]ac',0)) //abcbc abcbc abcbc ac 此处加空格是为了方便查看结果

</num;i++){

最佳答案

查看完整内容

首先,这不是C++代码,是JavaScript代码。 其次,这问题本身是容易解决的,你甚至顺手就能写出与之对应的文法: S -> ("[^0-9]+" | "[0-9]+" "[" S "]")* 因此根本没必要抄作业,自己直接照着文法就能编写出来。 但是如果你要用C语言来编写的话,那么这个难点就不是逻辑上该怎么写,而是其中的文本应该如何处理。 因为在C语言当中并没有文本型,所以处理起来会比较麻烦,比如我在下面就用到了二级指针来实现: #include #include ...

回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳

结帖率:100% (1/1)
发表于 2022-11-3 21:16:14 | 显示全部楼层   浙江省温州市
首先,这不是C++代码,是JavaScript代码。
其次,这问题本身是容易解决的,你甚至顺手就能写出与之对应的文法:
S -> ("[^0-9]+" | "[0-9]+" "[" S "]")*
因此根本没必要抄作业,自己直接照着文法就能编写出来。
但是如果你要用C语言来编写的话,那么这个难点就不是逻辑上该怎么写,而是其中的文本应该如何处理。
因为在C语言当中并没有文本型,所以处理起来会比较麻烦,比如我在下面就用到了二级指针来实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// S -> ("[^0-9]+" | "[0-9]+" "[" S "]")*
void S(char **str, char **newStr)
{
        while (**str && **str != ']')
        {
                if (**str >= '0' && **str <= '9')
                {
                        int num = 0;
                        while(**str >= '0' && **str <= '9')
                        {
                                num = num * 10 + *(*str)++ - '0';
                        }
                        char *start = ++*str;
                        char *temp = calloc(1,1);
                        S(str, &temp);
                        (*str)++;
                        *newStr = realloc(*newStr, strlen(*newStr) + num * strlen(temp) + 1);
                        while (num--)
                        {
                                strcat(*newStr, temp);               
                        }
                        free(temp);
                }
                else
                {
                        char *start = *str;
                        while (**str && (**str < '0' || **str > '9') && **str != ']')
                        {
                                (*str)++;       
                        }
                        if (*str > start)
                        {
                                int len = strlen(*newStr);
                                int newLen = len + (*str - start);
                                *newStr = realloc(*newStr, newLen + 1);
                                (*newStr)[newLen] = '\0';
                                strncpy(*newStr + len, start, newLen - len);
                        }
                }
        }
}
char *_S(char *str)
{
        char *newStr = calloc(1,1);
        S(&str, &newStr);
        return newStr;
}
int main()
{
        char *arr[] = { "3[2[0[x]]]", "s1[3[2[u]3[s]]]e" };
        for (int i = 0; i < sizeof(arr) / sizeof(*arr); i++)
        {
                char *str = _S(arr[i]);
                printf("%s: %s\n", arr[i], str);
                free(str);
        }
        return 0;
}

评分

参与人数 1荣誉 +1 收起 理由
笨潴 + 1 热心帮助他人,荣誉+1,希望继续努力(*^__^*) 嘻嘻!

查看全部评分

回复

使用道具 举报

结帖率:100% (1/1)

签到天数: 1 天

发表于 2022-11-4 00:47:25 | 显示全部楼层   浙江省湖州市
你这是js..不是C++
[C++] 纯文本查看 复制代码
std::string showStr(const std::string& s) {
        auto sResult = s;
        auto sEnd = sResult.find(']');
        while (sEnd != sResult.npos)         {
                auto sBegin = sResult.rfind('[', sEnd);
                if (sBegin == sResult.npos) break;
                auto sTemp = sResult.substr(sBegin + 1, sEnd - sBegin - 1);
                int n = 0;
                int p = 0;
                int b = 1;
                for (int i = (int)sBegin - 1; i >= 0; i--) {
                        auto k = sResult;
                        if (k > 48 && k <= 57) {
                                n += (k-48) * b;
                                p++;
                                b *= 10;
                        }
                        else break;
                }
                sResult.replace(sBegin - p, sEnd - sBegin + 1 + p, "");
                for (int i = 0; i < n; i++)                 {
                        sResult.insert(sBegin - p, sTemp);
                }
                sEnd = sResult.find(']');
        }
        return sResult;
}

C++可以这么写...至于C...你自己弄吧...纯C里面的字符串太麻烦,标准库我又不了解- -
回复

使用道具 举报

结帖率:100% (1/1)

签到天数: 1 天

发表于 2022-11-4 01:04:25 | 显示全部楼层   浙江省湖州市
你这个是js..不是C++
回复

使用道具 举报

结帖率:100% (1/1)

签到天数: 1 天

发表于 2022-11-4 01:06:01 | 显示全部楼层   浙江省湖州市
[C++] 纯文本查看 复制代码
std::string showStr(const std::string& s) {
        auto sResult = s;
        auto sEnd = sResult.find(']');
        while (sEnd != sResult.npos)         {
                auto sBegin = sResult.rfind('[', sEnd);
                if (sBegin == sResult.npos) break;
                auto sTemp = sResult.substr(sBegin + 1, sEnd - sBegin - 1);
                int n = 0;
                int p = 0;
                int b = 1;
                for (int i = (int)sBegin - 1; i >= 0; i--) {
                        auto k = sResult;
                        if (k > 48 && k <= 57) {
                                n += (k-48) * b;
                                p++;
                                b *= 10;
                        }
                        else break;
                }
                sResult.replace(sBegin - p, sEnd - sBegin + 1 + p, "");
                for (int i = 0; i < n; i++)                 {
                        sResult.insert(sBegin - p, sTemp);
                }
                sEnd = sResult.find(']');
        }
        return sResult;
}

这是我用C++写的....转C你自己想办法吧..我对纯C字符串标准库不了解...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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