标题:这是哪里错了。没搞懂。。。0-9运行就卡死
只看楼主
baolis
Rank: 2
来 自:呼啦瓦星
等 级:论坛游民
帖 子:39
专家分:59
注 册:2021-11-10
结帖率:100%
已结贴  问题点数:20 回复次数:18 
这是哪里错了。没搞懂。。。0-9运行就卡死
# 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");
}
搜索更多相关主题的帖子: putchar || 运行 case break 
2021-11-11 18:31
diycai
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:147
专家分:895
注 册:2021-5-18
得分:20 
字母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整除,故进入死循环。
2021-11-12 11:49
baolis
Rank: 2
来 自:呼啦瓦星
等 级:论坛游民
帖 子:39
专家分:59
注 册:2021-11-10
得分:0 
单步调试的时候,怎么显示c={char*}0xcccccccc <error>

  printf("Hello, world!\n"); cout << "Hello, world!" << endl;
2021-11-12 12:32
diycai
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:147
专家分:895
注 册:2021-5-18
得分:0 
回复 3楼 baolis
因为调试时,你的c未赋初值,调试都设置为0xCCCCCCCC (顺便说一下,INT 3 中断的机器码就是0xCC)
2021-11-12 13:03
baolis
Rank: 2
来 自:呼啦瓦星
等 级:论坛游民
帖 子:39
专家分:59
注 册:2021-11-10
得分:0 
ok,谢谢大神,对了,大神能看出来我发出来的那段程序代码,是字符展开代码吗?

  printf("Hello, world!\n"); cout << "Hello, world!" << endl;
2021-11-12 13:57
diycai
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:147
专家分:895
注 册:2021-5-18
得分:0 
回复 5楼 baolis
参数1:  1 正常展开
         2 展开,并且将展开中的小写变大写
         3 展开,展开的字符都用*代替
         其他值,展开但不输出展开的字符

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

参数3:  1 顺序展开
         2 逆序展开
         其他值,不清楚
2021-11-12 15:11
diycai
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:147
专家分:895
注 册:2021-5-18
得分:0 
# 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
2021-11-12 15:32
baolis
Rank: 2
来 自:呼啦瓦星
等 级:论坛游民
帖 子:39
专家分:59
注 册:2021-11-10
得分:0 
完了,这思路完全跟不上了。。。

  printf("Hello, world!\n"); cout << "Hello, world!" << endl;
2021-11-12 17:51
baolis
Rank: 2
来 自:呼啦瓦星
等 级:论坛游民
帖 子:39
专家分:59
注 册:2021-11-10
得分:0 
大神,有时间您帮忙改一下吧,我是越改越迷糊
# 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");
}

  printf("Hello, world!\n"); cout << "Hello, world!" << endl;
2021-11-12 18:09
baolis
Rank: 2
来 自:呼啦瓦星
等 级:论坛游民
帖 子:39
专家分:59
注 册:2021-11-10
得分:0 
1、输入0-9 卡住,不显示
2、输入a-z 显示的是az。
3、输入abdefc 显示的还是abdefc没有排序。
没有上次您写的那个字符展开的效果。如输入0-9 ,显示的0123456798,等。

  printf("Hello, world!\n"); cout << "Hello, world!" << endl;
2021-11-12 18:13



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-507478-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025965 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved