注册 登录
编程论坛 C语言论坛

这是哪里错了。没搞懂。。。0-9运行就卡死

baolis 发布于 2021-11-11 18:31, 2603 次点击
# include <stdio.h>
# define upper(ch) ch>='a' && ch<='z'?ch-'a'+'A':ch
signed main()
{
    char abbr[101],*c;
    short p1,p2,p3,L,l,R;
    scanf("%hd %hd %hd",&p1,&p2,&p3);
    scanf("%s",abbr);
    putchar(*(c=abbr));
    while(*++c)
        if(*c!='-'||(L=*(c+1)-*(c-1))<=0||*(c-1)=='-'||L>25)
            putchar(*c);
        else
            for(l=p3==1?1:L-1;l && l<L;l-=p3*2-3)
                for(R=p2;R;--R)
                    switch(p1)
                    {
                        case 1: putchar(*(c-1)+l); break;
                        case 2: putchar(upper(*(c-1)+l)); break;
                        case 3: putchar('*');
                    }
    return !printf("\n");
}
18 回复
#2
diycai2021-11-12 11:49
字母l与数字1容易混淆,这里字母l用m替代。
for(m=p3==1?1:L-1;m && m<L;m-=p3*2-3)
输入0-9, 则 L = '9' - '0' = 9, 故此处 m 初值为  1 或 8。
循环执行条件为 m && m<L;  而 L 恒为9,
要想循环退出, 则需要 m-=p3*2-3 执行一次或多次后, m >= L,或者 m == 0。
若想 m >= L,则参数 p3必须小于等于1。
若想 m == 0,则参数 p3必须大于等于2, 且 m 能整除 p3*2-3。

for(R=p2;R;--R)
此处若p2输入为负数,则循环也将多出几万次,相信不是程序故意的设置。

所以需要控制输入的参数p1 p2 p3,
首先p2不能为负,
当p3小于等于1时, p1和输入数据可随意。
当p3等于2时,由于 p3*2-3等于1, 所以p1和输入数据可随意。
当p3大于2时,若输入数据0-9,则m为8, p3*2-3的值为3/5/7/...,不能被m整除,故进入死循环。
#3
baolis2021-11-12 12:32
单步调试的时候,怎么显示c={char*}0xcccccccc <error>
#4
diycai2021-11-12 13:03
回复 3楼 baolis
因为调试时,你的c未赋初值,调试都设置为0xCCCCCCCC (顺便说一下,INT 3 中断的机器码就是0xCC)
#5
baolis2021-11-12 13:57
ok,谢谢大神,对了,大神能看出来我发出来的那段程序代码,是字符展开代码吗?
#6
diycai2021-11-12 15:11
回复 5楼 baolis
参数1:  1 正常展开
         2 展开,并且将展开中的小写变大写
         3 展开,展开的字符都用*代替
         其他值,展开但不输出展开的字符

参数2:  展开的每个字符的重复次数

参数3:  1 顺序展开
         2 逆序展开
         其他值,不清楚
#7
diycai2021-11-12 15:32
# define upper(ch) ch>='a' && ch<='z'?ch-'a'+'A':ch
新手容易犯错的地方, 预处理应该这么写
#define upper(ch) ((ch)>='a' && (ch)<='z' ? (ch)-'a'+'A':(ch))

你可以试试
putchar(upper('b' ^ 1));//预期输出字符C
#8
baolis2021-11-12 17:51
完了,这思路完全跟不上了。。。
#9
baolis2021-11-12 18:09
大神,有时间您帮忙改一下吧,我是越改越迷糊
# include <stdio.h>
#define upper(ch) ((ch)>='a' && (ch)<='z' ? (ch)-'a'+'A':(ch))
signed main()
{
    char abbr[101],*c;
    short p1,p2,p3,L,m,R;
    scanf("%hd %hd %hd",&p1,&p2,&p3);
    scanf("%s",abbr);
    putchar(*(c=abbr));
    while(*++c)
        if(*c!='-' || (L=*(c+1)-*(c-1))<=0 || *(c-1)=='-' || L>25)
            putchar(*c);
        else
            for(m=p3==1?1:L-1;m && m<L;m-=p3*2-3)
                for(R=p2;R;--R)
                    switch(p1)
                    {
                        case 1: putchar(*(c-1)+m); break;
                        case 2: putchar(upper(*(c-1)+m)); break;
                        case 3: putchar('*');
                    }
    return !printf("\n");
}
#10
baolis2021-11-12 18:13
1、输入0-9 卡住,不显示
2、输入a-z 显示的是az。
3、输入abdefc 显示的还是abdefc没有排序。
没有上次您写的那个字符展开的效果。如输入0-9 ,显示的0123456798,等。
#11
diycai2021-11-12 23:15
回复 10楼 baolis
详细描述一下需求啊。
#12
baolis2021-11-12 23:19
在保存字符串时,对出现在连续位置的若干个字符,如这些字符在ASCII表中也是连续出现,则可以将这些字符使用缩写形式进行保存,以节省保存空间。例如用A-Z表示ABCDEFGHIJKLMNOPQRSTUVWXYZ,1-5表示12345,c-f表示cdef。
【要求】用指针完成
输入:包含缩写形式的字符串
输出:将缩写形式进行还原后的字符串
说明:只处理大小写字母和数字,即对于形如A-9,a-C这样的缩写不进行处理
测试用例1
输入:0-9
输出:0123456789
测试用例2
输入:a-z
输出:abcdefghijklmnopqrstuvwxyz
测试用例3
输入:G-I
输出:GHI
测试用例4
输入:ABDG-K035-9abd-h
输出:ABDGHIJK0356789abdefgh
#13
diycai2021-11-12 23:27
回复 12楼 baolis
代码没问题, 注意要先输入三个参数, 然后再输入字符串

参数1:  1 正常展开
         2 展开,并且将展开中的小写变大写
         3 展开,展开的字符都用*代替
         其他值,展开但不输出展开的字符

参数2:  展开的每个字符的重复次数

参数3:  1 顺序展开
         2 逆序展开
         其他值,不清楚


例如输入: 1 1 1
0~9
#14
baolis2021-11-12 23:34
就是这个效果,大神怎么才能学好指针呐,一用到指针就懵
#15
diycai2021-11-12 23:34
只有本站会员才能查看附件,请 登录
#16
diycai2021-11-12 23:36
回复 14楼 baolis
哪里懵?是不理解还是用不好?
#17
baolis2021-11-12 23:39
主要是用不好,指着指着,脑袋就乱了
#18
diycai2021-11-12 23:54
以下是引用baolis在2021-11-12 23:39:38的发言:

主要是用不好,指着指着,脑袋就乱了

前期可以多画画图, 推荐你学习一下 【斯坦福大学公开课】编程范式, 对这些指针、函数的理解将更加深入。
https://open.

能坚持看完并理解吸收,你的编程水平(不含算法)在国内就是前1%。
#19
baolis2021-11-12 23:56
OK,十分感谢大神
1