今天在做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++;
}