首页
社区
课程
招聘
[讨论]奇怪现象
发表于: 2009-11-19 09:10 3964

[讨论]奇怪现象

2009-11-19 09:10
3964
繁忙高手说一下原因:
char Ctfunlower(int c)
{
        return (c>='A' && c<='Z') ? c + 'a' - 'A' : c ;
}
char Ctfunupper(int c)
{
        return (c>='a' && c<='z') ? c + 'A' - 'a' : c ;
}
int main(void)
{
        int c;//error
        //char c;//ok
        while (1)
        {
                scanf("%c",&c);
                if (c == '.')
                {
                        printf("\nEnd... ...\n");
                        break;
                }
                c = Ctfunlower(c);
                //c = Ctfunupper(c);
                printf("%c",c);
        }
    return 0;
}
请输入测试一下,无论是大转小写还是小写转大写,第一个字符始终无法转换成功。
但是如果将两个转换函数的形参类型改为char方可正常,或者将main()函数中的int c变量改为char类型(此时转换函数的形参可为int)传给转换函数也可以正常。
(貌似无论输入的第一个字符是什么好像根本就无效,不单单是在转换函数中无效);
这是咋回事啊?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 348
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
基础知识不扎实,你使用的int c 属于局部类型,没有被初始化,当然会出错了!! 你可以这样 int c = 0;
或是声明为全局变量自动初始化了,不过为了程序的可读性和安全性尽量使用局部变量
2009-11-19 11:10
0
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
嗯。。。接受你的教训,基础的确不扎实。
谢谢了。
2009-11-19 11:21
0
雪    币: 348
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
惭愧,还一根本原因没说出来
char c; //可以使用
int c; //不可以使用

这要看你是用什么编译器 和使用的什么后缀的.c or cpp

sizeof(c) 加到 main 和 Ctfunlower 中 print出来 一切自然明了。
2009-11-19 11:56
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
不知道楼主用的什么环境,我用的VS2005,以上代码正常运行,main中为int,形参也为int
2009-11-19 12:53
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
6.0测试也通过。。。。
你尝试下在scanf前加个fflush(stdin);头文件加上stdlib.h
2009-11-19 12:57
0
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我的环境是vc6.0....我设置了一个断点,在scanf的下一句,然后输入一个字符c,此时查看变量c的值.
如图。。

此时int类型变量的低八位是我输入的字符的ascii,我不明白的是在和准备要比较的char类型变量进行比较时,是int自动截取低八位还是char类型的变量强制转为int类型。我在一个群里得到的答案是说这是inter cpu 的一个漏洞,至今未曾解决。
上传的附件:
2009-11-19 14:31
0
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我保存的是.c
2009-11-19 14:44
0
游客
登录 | 注册 方可回帖
返回
//