冷回清风暖 发表于 2020-3-3 12:09:27

字符大小写转换

我是用的是code::blocks
先附上代码
#include <stdio.h>
#define NUM 32

int main()
{
    int i, ch;
    printf("请输入一行英文句子:\n");
    while((ch = getchar())!= EOF)
    {
      if (ch >= 'A' && ch <= 'Z')
      {
            ch = ch + NUM;
      }
      else if('a' <= ch <= 'z')
      {
            ch = ch - NUM;
      }
      putchar(ch);
    }

    return 0;
}

在第08行 while((ch = getchar())!= EOF)会检测输入的是否是文件结束符,我的系统是win10,循环终止的条件是用户按下了 ctrl + z

我输入第一行内容:success 输出结果正常
但是继续输入其他内容会出现乱码
可能是出现特殊字符的原因
求解

另外有没有办法使这个程序能够正常输出

我的编译器和运行结果附图

人造人 发表于 2020-3-3 12:11:57

你有认真检查你的代码吗?
else if('a' <= ch <= 'z')

冷回清风暖 发表于 2020-3-3 12:20:22

人造人 发表于 2020-3-3 12:11
你有认真检查你的代码吗?

不可以这样写吗?{:10_277:} ch 是int然后它处于对应字符ASCLL码的范围之间

冷回清风暖 发表于 2020-3-3 12:22:19

人造人 发表于 2020-3-3 12:11
你有认真检查你的代码吗?

我按照你的改过来了 运行是对的 不过为什么呢{:10_266:} 求解

人造人 发表于 2020-3-3 12:22:19

冷回清风暖 发表于 2020-3-3 12:20
不可以这样写吗? ch 是int然后它处于对应字符ASCLL码的范围之间

这是C语言,你从python过来的?

那你为什么这么写?
if (ch >= 'A' && ch <= 'Z')

冷回清风暖 发表于 2020-3-3 12:24:42

人造人 发表于 2020-3-3 12:22
这是C语言,你从python过来的?

那你为什么这么写?

我是为了测试看看他们两个能够达到一样的效果
输入一行数据的时候可以
输入第二行的时候就不行了
不过为什么 ch >='a'&& ch <= 'z' 和 'a' <= ch <= 'z'不相同呢?

人造人 发表于 2020-3-3 12:26:27

冷回清风暖 发表于 2020-3-3 12:24
我是为了测试看看他们两个能够达到一样的效果
输入一行数据的时候可以
输入第二行的时候就不行了


C语言不支持这样的写法,就是这么简单,不支持就是不支持,没有商量的余地

qiuyouzhi 发表于 2020-3-3 12:27:45

冷回清风暖 发表于 2020-3-3 12:24
我是为了测试看看他们两个能够达到一样的效果
输入一行数据的时候可以
输入第二行的时候就不行了


C语言的语法不允许这样写

冷回清风暖 发表于 2020-3-3 12:28:12

人造人 发表于 2020-3-3 12:26
C语言不支持这样的写法,就是这么简单,不支持就是不支持,没有商量的余地

唉 好的把 谢谢

冷回清风暖 发表于 2020-3-3 12:30:24

冷回清风暖 发表于 2020-3-3 12:28
唉 好的把 谢谢

谢谢

一个账号 发表于 2020-3-3 12:31:10

冷回清风暖 发表于 2020-3-3 12:24
我是为了测试看看他们两个能够达到一样的效果
输入一行数据的时候可以
输入第二行的时候就不行了


这是规定,不能那样写

冷回清风暖 发表于 2020-3-3 12:36:06

一个账号 发表于 2020-3-3 12:31
这是规定,不能那样写

谢谢

冷回清风暖 发表于 2020-3-3 12:38:11

qiuyouzhi 发表于 2020-3-3 12:27
C语言的语法不允许这样写

谢谢

乘号 发表于 2020-3-3 13:10:50

c语言不允许你那样写{:10_256:}

冷回清风暖 发表于 2020-3-3 13:20:19

乘号 发表于 2020-3-3 13:10
c语言不允许你那样写

谢谢

冷血无情 发表于 2020-3-3 14:04:47

这可太真实了 {:10_256:}

xhiddsasbmxi 发表于 2020-3-3 21:24:41

规定不能破

TCY 发表于 2020-3-6 16:49:05

人造人 发表于 2020-3-3 12:26
C语言不支持这样的写法,就是这么简单,不支持就是不支持,没有商量的余地

那为什么不报错?

qiuyouzhi 发表于 2020-3-6 17:11:01

TCY 发表于 2020-3-6 16:49
那为什么不报错?

C语言都能有乱码大赛,这么一个小东西
编译器是不会在意的,只不过不会达到需要的效果

人造人 发表于 2020-3-6 18:01:33

TCY 发表于 2020-3-6 16:49
那为什么不报错?

因为这么写,在C语言中不属于语法错误,这属于逻辑错误
C语言编译器只有在语法错误的时候才报错,逻辑错误有可能是报警告,也有可能编译器根本就发现不了
语法错误编译器是一定会报错的,但是逻辑错误就不一定了,如果编译器能检查出来,那就报警告

比较运算符从左到右结合,也就是
else if('a' <= ch <= 'z')
else if(('a' <= ch) <= 'z')

先计算 'a' <= ch
这个表达式的结果要么为真,要么为假,要么是0,要么是1
然后拿0或1和 'z'比较,是小于等于运算
'z' 永远大于0,也永远大于1

也就是
else if('a' <= ch <= 'z')
else if(1)

一个效果,'a' <= ch <= 'z'
这个表达式的结果永远为1,不管ch是什么,结果永远是1
页: [1] 2
查看完整版本: 字符大小写转换