由getchar()函数的使用而引发的思考.

本文深入探讨了在C语言程序设计中,使用getchar()函数直接存储输入字符时出现的问题,详细解释了其返回类型为int而非char的原理及导致的数据截断现象,并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在做C语言程序设计,练习2-4中,所遇到的问题,在存储输入的字符时,为了方便起见,直接使用不带变量赋值定义的getchar()。

示例错误代码:

char s1[];
for(int i=0; i < MAXLINE - 1 && getchar() != EOF; ++i) {
    printf("s1's i: %d\n", i);
    s1[i] =getchar();
    printf("s1: %c\n", s1[i]);
  }

当输入123456789时,按理说我想要的结果应该是


但是很奇怪这个很奇怪,其表示结果却为

为什么会出现这样的问题呢?

    原因在于getchar()在C语言中默认是用int类型作为返回值(这个是很经典的错误,按照getchar()名字的意思,应该将返回的值定义为char类型。但是很不幸,getchar()函数的返回值却是int类型),而int类型在计算机中是占用2B的大小,char却只占1B大小,而且int类型在计算机内是补码表示的(int的范围是-32768~32767),当进行数据类型转换时(大转小),往往是截断高位,保留低位,所以就出现了这样的问题,只保留后半部分,前面被截断了。

我所遇到的几种错误用法:

sample 1:  

char c;
while ((c = getchar()) != EOF) {
}
...

sample 2:

char c[MAX];
while (getchar() != EOF) {
c[MAX] = getchar();
}
...

开头的例子正确代码应该是:

  int c;

  int length_s1 = 0;
  int length_s2 = 0;
  for (int i=0; i < MAXLINE - 1 && (c = getchar()) != EOF; ++i) {
    printf("s1: i: %d\n", i);
    s1[i] = c;
    printf("s1: %c\n", s1[i]);
    length_s1++;
  }







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值