如何实现:输出一串字符后,删去最后一个字符,再换行。

Charles Pao 2017-12-10 09:06:00
问题背景:遇到一类题,需要输出一串字符,且字符间需要有某个符号连接,但最后一个字符后面不能出现该符号,并需要换行输出。如:将某个数分解为因数相乘形式:a=b*c*d*e。这类题往往用到循环结构,每次输出一个数字后输出一个“ * ”,但根据实际情况最后的那个“ * ”是不需要的。并且题目要求:最后一个数字后无空格,并换行。


最初尝试:在所有字符“a=b*c*d*e*”输出后,加上“/b/n”,发现最后的“ * ”依然存在。


搜索求解:搜寻信息后,了解到“/b”的作用(至少在C语言中)只是让光标的位置退后一格,并不会删除字符,只有当再输入其他字符进行覆盖后,才能消除原有的字符。发现有人遇到了同样的问题,阅读一些解决方案,基本都是将输出改为“/b /n”(/b与/n之间有空格),即用空格来覆盖原字符,达到形式上消除最后一个原字符的目的。然而,在输出后多了一个空格,与题目输出要求的直接换行不符。不可行。

更改方案:将原本先输出一个数字,后加“ * ”的方式改为先输出“ * ”,后输出数字。考虑到第一个数字前不用加“ * ”,引入一个计数器i,每次输出数字时记下该数的输出序号。运用选择结构:如果这是第一个输出的数,只输出该数字;不然的话,先输出“ * ”,后输出数字。如此最后一个数字后就不会再有“ * ”。

方案分析:虽然实现了目的,但似乎有浪费资源的弊端。我的目的只是找到第一个数字,然而,利用完“第一个数字”这个特性后,程序依然在之后计算了第二个、第三个、第四个等数字的序号,然而这对我来说已是没有必要的了。

寻求答案:有什么更优的方案来实现题目要求?

补充:题主为C语言初学者,基础比较薄弱,最好能有基础的实现方法。当然,高阶的方法也愿意洗耳恭听。
...全文
478 2 1 打赏 收藏 举报
写回复
2 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
赵4老师 2017-12-10
参考《编译原理》中的词法分析和有限状态自动机。
//有字符串
//1_22_333,,4444__55555,_666666
//需要解析为
//1
//22
//333
//_
//4444
//55555
//666666
#include <stdio.h>
char s[]="1_22_333,,4444__55555,_666666";
char c,*p,*p1;
int st;
void main() {
    st=0;
    p=s;
    while (1) {
        c=*p;
        if (0==c) {
            switch (st) {
            case 1:printf("_\n");    break;
            case 2:printf("%s\n",p1);break;
            }
            break;//
        }
        switch (st) {
        case 0:
                 if ('_'==c) {                            st=0;}
            else if (','==c) {                            st=1;}
            else             {p1=p;                       st=2;}
        break;
        case 1:
                 if ('_'==c) {                            st=1;}
            else if (','==c) {printf("_\n");              st=1;}
            else             {p1=p;                       st=2;}
        break;
        case 2:
                 if ('_'==c) {*p=0;printf("%s\n",p1);*p=c;st=0;}
            else if (','==c) {*p=0;printf("%s\n",p1);*p=c;st=1;}
            else             {                            st=2;}
        break;
        }
        p++;
    }
}
//1
//22
//333
//_
//4444
//55555
//666666
  • 打赏
  • 举报
回复
Charles Pao 2017-12-10
引用 1 楼 ckc 的回复:
最简单的就是你的更改方案 不是第一个需要特殊处理就是最后一个需要特殊处理 这种情况下第一个特殊处理可能会简单些
谢谢。
  • 打赏
  • 举报
回复
ckc 2017-12-10
最简单的就是你的更改方案 不是第一个需要特殊处理就是最后一个需要特殊处理 这种情况下第一个特殊处理可能会简单些
  • 打赏
  • 举报
回复
相关推荐
发帖
新手乐园
加入

3.3w+

社区成员

C/C++ 新手乐园
申请成为版主
帖子事件
创建了帖子
2017-12-10 09:06
社区公告
暂无公告