int c = getchar()?

好的,所以我正在读这本书:C编程语言 – 由Kernighan和Ritchie(第二版)和其中一个例子我很难理解事情是如何工作的。

#include  #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(),怎么样integer =从命令行输入的字符? 整数是,但我输入的字符是如何存储的?

提前致谢

与您可能使用的其他语言不同,C 中的字符整数。 char只是另一种整数类型,通常是8位且小于int ,但仍然是整数类型。

因此,您不需要使用其他语言的ord()chr()函数。 在C中,您可以使用强制转换或仅通过分配在char和其他整数类型之间进行转换。

除非发生EOF,否则getchar()被定义为返回“转换为int的unsigned char”( 与fgetc相同 ),所以如果它有帮助你可以想象它读取一些char, c ,则返回(int)(unsigned char)c

您可以通过强制转换或赋值将其转换回unsigned char ,如果您愿意略微损失理论上的可移植性,可以将其转换为带有char转换的char或将其赋值给char

getchar()返回一个整数,它是输入字符的表示forms。 如果输入字符A ,您将返回'A'0x41 (升级为int并假设您当然在ASCII系统上)。

它返回int而不是char的原因是因为它需要能够存储任何字符加上输入流关闭的EOF指示符。

并且,对于它的价值而言,这对初学者来说并不是一本好书。 这是从效率比可读性和可维护性更重要的日子。

虽然它显示了K&R之类的聪明之处,但你可能应该更多地看待…新手友好。

无论如何,它的最后一版涵盖了C89,并且从那以后发生了很多变化。 我们已经通过C99,现在有了C11,这本书还没有更新,以反映其中任何一个,所以它可怕的过时了。

C char类型是8位,这意味着它可以存储-128到127的整数范围(255个不同的值;这是ASCII的范围)。 getchar()返回int ,它至少为16位(在现代机器上通常为32位)。 这意味着它可以存储char的范围以及更多的值。

返回类型为int的原因是因为在到达输入流的末尾时返回特殊值EOF 。 如果返回类型是char ,则无法通知遇到流的末尾(除非它指向记录此条件的变量的指针)。

在命令行中输入的每个字符(包括数字)都将作为字符读取,并且每个字符都具有基于其ASCII代码http://www.asciitable.com/的整数值。

您的问题的答案已得到解答。 但只需再添加一件东西。

当你将变量c声明为int时。 很明显,你从0 to 9取值,ascii值为48-57 。 所以你可以再添加1行代码 –

c = c-48