《C语言程序设计》中文版第二版27页-28页之间的一段程序,程序的功能是打印当前最长的输入行。正确程序如下:程序1:正确程序。#include #defineMAXLINE1000/*允许的输入行最大长度*/intmax;/*当前最长输入行长度*/charline[MAXLINE];/*当前输入行*/charlongest[MAXLINE];/*当前最长输入行*/intgetline(void);voidcopy(void);/*打印当前最长输入行,特殊版本*/main(){intlen;externintmax;externcharlongest[];max=0;while((len=getline())>0)if(len>max){max=len;copy();}if(max>0)/*therewasaline*/printf("%s",longest);return0;}/*getline:特殊版本*/intgetline(void){intc,i;externcharline[];for(i=0;i&&(c=getchar())!=EOF&&c!='\n';++i) line[i]=c;if(c=='\n'){line[i]=c;++i;}line[i]='\0';returni;}/*copy:特殊版本*/voidcopy(void){inti;externcharline[],longest[];i=0;while((longest[i]=line[i])!='\0')++i;}然而中文版因为印刷错误或者别的什么原因,实际上在getline子函数那个for循环里少了一个左括号。书中原版的程序如下:程序2:中文版中少了一个括号的程序(该程序无法通过编译)。#include #defineMAXLINE1000/*允许的输入行最大长度*/intmax;/*当前最长输入行长度*/charline[MAXLINE];/*当前输入行*/charlongest[MAXLINE];/*当前最长输入行*/intgetline(void);voidcopy(void);/*打印当前最长输入行,特殊版本*/main(){intlen;externintmax;externcharlongest[];max=0;while((len=getline())>0)if(len>max){max=len;copy();}if(max>0)/*therewasaline*/printf("%s",longest);return0;}/*getline:特殊版本*/intgetline(void){intc,i;externcharline[];for(i=0;i&&(c=getchar))!=EOF&&c!='\n';++i) line[i]=c;if(c=='\n'){line[i]=c;++i;}line[i]='\0';returni;}/*copy:特殊版本*/voidcopy(void){inti;externcharline[],longest[];i=0;while((longest[i]=line[i])!='\0')++i;}我想问的问题是这样的:原版程序中getline子函数里这句for(i=0;i&&(c=getchar))!=EOF&&c!='\n';++i) 因为左边两个括号,右边三个括号,所以编译无法通过是很正常的。我当时第一反应这么改的:for(i=0;i&&((c=getchar))!=EOF&&c!='\n';++i) 就是在第一个"&&"后面随手加了个左括号(因为当时光想着匹配括号数了)。这样两边括号数目是匹配了,但结果是能编译通过,却无法在弹出的cmd里输入任何东西。但是这和我预期的不一样。我认为既然getchar那里后面没有那一对括号了(正确用法不应该是getchar()吗?),那么程序不就错了么。应该是无法编译通过才对。可结果跟我想象的不一样。或者说"getchar没有那对括号就不能输入值了,但是编译器那里依然能通过。"这个说法对吗?Win7系统,IDECode::Blocks13.12谢谢回答了~
元芳怎么了
相关分类