我无法得出关于循环语句中的"测试的结论"在编程方面意味着。它是关于循环括号中的测试还是循环迭代的大括号中的测试?
练习1.18在这里:
char line[];
int max;
main()
{
int len;
extern int max;
extern char save[];
max = 0;
while((len = getline(line, MAXLINE)))
if (len > max){
max = len;
copy();
}
if (max > 0) printf("%s",save);
}
getline()
{
int c,i;
extern char line[];
for (i=0; i<= MAXLİNE -1 && ((c = getchar())!= EOF) && c != '\n';)
line[i++]=c;
if (c == '\n')
{
line[i] = c;
++i;
}
s[i] = '\0';
return (i) ;
}
copy()
{
int i;
extern char save[];
extern char line[];
int i = 0;
while( (save[i] = line[i] ) != '\0')
++i;
}
练习l-18。上面的getline的for语句中的测试是相当的 笨拙。重写程序以使其更清晰,但保留相同 文件末尾或缓冲区溢出时的行为。这种行为最合理吗?
答案 0 :(得分:1)
从注释开始,似乎应该重写for循环以使代码更具可读性。
我可以建议以下解决方案用for循环代替while循环。
getline()
{
int c, i;
extern char line[];
i = 0;
while ( i <= MAXLINE -1 && ((c = getchar()) != EOF) && c != '\n' )
{
line[i++] = c;
}
if (c == '\n')
{
line[i++] = c;
}
line[i] = '\0';
return i;
}
重写函数后,我看到了一个错误。必须初始化变量c
,并且必须更改while循环中的第一个子条件。
因此该函数可以查找例如
getline()
{
int c, i;
extern char line[];
i = 0;
c = EOF;
while ( i < MAXLINE - 1 && ((c = getchar()) != EOF) && c != '\n' )
{
line[i++] = c;
}
if (c == '\n')
{
line[i++] = c;
}
line[i] = '\0';
return i;
}
这是一个示范程序
#include <stdio.h>
#include <string.h>
#define MAXLINE 10
char line[MAXLINE];
int getline( void )
{
int c, i;
extern char line[];
i = 0;
c = EOF;
while (i < MAXLINE - 1 && ((c = getchar()) != EOF) && c != '\n')
{
line[i++] = c;
}
if (c == '\n')
{
line[i++] = c;
}
line[i] = '\0';
return i;
}
int main( void )
{
int max = 0;
int len;
char save[MAXLINE];
while ((len = getline()))
if (len > max) {
max = len;
strcpy( save, line );
}
if (max > 0) printf("%s", save);
return 0;
}
它的输出(如果在Windows中作为控制台应用程序运行)可能看起来像
1
123456789
12345
123
1234567
^Z
123456789