好的,所以我正在读这本书:C编程语言 - 由Kernighan和Ritchie(第二版)和其中一个例子我很难理解事情的运作方式。
#include <stdio.h>
#define MAXLINE 1000
int getline(char line[], int maxline);
void copy(char to[], char from[]);
int main(int argc, char *argv[])
{
int len;
int max;
char line[MAXLINE];
char longest[MAXLINE];
max = 0;
while((len = getline(line, MAXLINE)) > 1)
{
if(len > max)
{
max = len;
copy(longest, line);
}
}
if(max > 0)
printf("%s", longest);
getchar();
getchar();
return 0;
}
int getline(char s[], int lim)
{
int c, i;
for(i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
s[i] = c;
if(c == '\n')
{
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
void copy(char to[], char from[])
{
int i;
i = 0;
while((to[i] = from[i]) != '\0')
++i;
}
行:for(i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
在哪里说c = getchar(),怎么能从命令行输入整数=字符?整数是,但我输入的字符是如何存储的?
提前致谢
答案 0 :(得分:30)
与您可能使用的其他语言不同,C 中的字符是整数。 char
只是另一种整数类型,通常为8位且小于int
,但仍为整数类型。
因此,您不需要使用其他语言的ord()
和chr()
函数。在C中,您可以使用强制转换在char
和其他整数类型之间进行转换,或者仅通过分配。
除非发生EOF,否则getchar()
被定义为返回“转换为int的无符号字符”(same as fgetc),所以如果它有帮助你可以想象它会读取一些字符c
},然后返回(int)(unsigned char)c
。
您可以仅通过演员或作业将其转换回unsigned char
,如果您愿意略微损失理论上的可移植性,则可以将其转换为char
施放或将其指定给char
。
答案 1 :(得分:11)
getchar()
函数返回一个整数,该整数表示输入的字符。如果您输入字符A
,则会返回'A'
或0x41
(升级为int
,并假设您当然使用的是ASCII系统。)
它返回int
而不是char
的原因是因为它需要能够在输入流关闭的地方存储任何字符 plus EOF指示符。
而且,对于它的价值而言,这对初学者来说并不是一本好书。它来自效率比可读性和可维护性更重要的日子。
虽然它显示了K&amp; R这样的人有多聪明,但你可能应该更多地看待...新手友好。
无论如何,它的最后一版涵盖了C89,并且从那以后发生了很多变化。我们已经通过C99,现在已经有了C11,而且这本书还没有更新以反映其中任何一本,所以它已经过时了。
答案 2 :(得分:4)
C char
类型是8位,这意味着它可以存储整数范围(取决于它是否有符号,如果你没有指定它,C标准没有规定它是什么) )-128到127或0到255(255个不同的值;这是ASCII的范围)。 getchar()
返回int
,它至少为16位(现代机器上通常为32位)。这意味着它可以存储char
的范围以及更多值。
返回类型为int
的原因是因为在到达输入流的末尾时返回特殊值EOF
。如果返回类型为char
,则无法通知遇到流的末尾(除非它指向记录此条件的变量的指针)。
答案 3 :(得分:0)
现在让我们玩逻辑游戏。
Char也是一种整数类型,其范围比int小,更确切地说是8位,即1个字节。众所周知,整数类型包括有符号(默认)和无符号。至于char,有符号的范围是-127〜128,无符号的范围是0〜255。现在我们知道了有符号和无符号char的类型和“功能”。
当计算机仅重新识别二进制序列时,我们就可以理解字符。因此,各种编程语言都必须提供一个模型来处理从字符到二进制序列的分离。 ASCII代码是映射的标准,适用于C和许多其他编程语言。编码0-9,a-z和A-Z等基本字符以及通常的特殊字符需要0-255。
您可能想知道unsigned char是正确的选择。但是,编程应该知道何时停止。最简单的方法是满足一个特殊的值,负数是一个不错的选择,因为其他语言可能会使用较大的正值。最后,C选择了-1,通常称为EOF。
现在我们明白了。带符号的char不足以编码ASCII字符,而带符号的char没有足够的余量作为终止值。我们需要更大的范围来平衡此类型,即int类型。闷吗?
感谢@cdhowie的回答,它敏锐地点燃了我。
答案 4 :(得分:-1)
在命令行中输入的每个字符(包括数字)都将作为字符读取,并且每个字符都具有基于其ASCII代码http://www.asciitable.com/的整数值。
答案 5 :(得分:-3)
您的问题的答案已得到解答。但是再添加一件事。
当您将变量c
声明为int时。很明显,您从0 to 9
获取ascii值为48-57
的值。
所以你可以在代码中添加1行 -
c = c-48
。