我从K& R复制了以下C代码。如果代码当前是用户键入的最长行,则该代码应该打印一行。 这是代码:
#include <stdio.h>
#define MAXLINE 1000
int max;
char line[MAXLINE];
char longest[MAXLINE];
int getline();
void copy();
int main(){
int len=0;
extern int max;
extern char longest[];
max = 0;
while((len = getline()) > 0)
if (len > max){
max = len;
copy();
}
if (max > 0){
printf("%s", longest);
}
return 0;
}
int getline(){
int c;
int i;
extern char line[];
for(i = 0; i < MAXLINE-1
&&(c=getchar())!=EOF&&c!='\n';++i)
line[i] = c;
if(c=='\n'){
line[i]=c;
++i;
}
line[i] = '\0';
return i;
}
void copy(){
int i;
extern char line[];
extern char longest[];
i=0;
while((longest[i]=line[i])!='\0')
++i;
}
问题在于它似乎不起作用。运行代码,我可以在控制台中键入行,但不打印最长的行。我将不胜感激任何帮助。
额外信息: I7m使用Win7和Open Watcom编译器。 控制台没有折叠,它让我输入字符。 另外,我不确定我是否陷入循环,因为如果我将main()中的while循环更改为
while((len = getline()) > 0)
if (len > max){
printf("IT WORKS");
max = len;
copy();
}
如果行的长度比当前的最大长度长,则使用打印命令,然后在屏幕上打印“IT WORKS”。所以它肯定是在计算线长。
答案 0 :(得分:5)
实际上它确实如此,但在您输入end-of-file character.
之前,它不会停止读取行这是Unix / Mac上的^ D和Windows上的^ Z. (但请注意,Windows并没有真正实现终端EOF,因此由您的库或Cygwin之类的东西来解释^ Z.)
如果您的窗口仅在程序运行时处于活动状态,我认为sleep(5)
在main()的最后可能是个好主意。从像Mac上的终端或Windows上的DOS框这样的长寿命窗口运行这样的控制台I / O程序真的是最好的。
答案 1 :(得分:0)
getline
返回1高于预期值,因此如果用户刚进入,则不会退出循环。另外,在getch()
功能return 0
之前添加main
,控制台在打印最长行后退出/折叠。许多书籍都有相同的示例,因此如果您希望控制台保持打开状态,请放置getch
,以便用户在程序退出之前敲击一个键。在这里,尝试以下代码:
#include <stdio.h>
#define MAXLINE 1000
int max;
char line[4];
char longest[MAXLINE];
int getline();
void copy();
int main()
{
int len=0;
extern int max;
extern char longest[];
max = 0;
/* put -1 to getline so it will return the right length... */
while(((len = getline()) - 1) > 0)
{
printf("%d \n",len);
if (len > max)
{
max = len;
copy();
}
}
if (max > 0)
{
printf("%s", longest);
}
/* Put getch() or getchar() so console will wait for a key to be pressed before exiting */
getch();
return 0;
}
int getline()
{
int c;
int i;
extern char line[];
for(i = 0; i < MAXLINE-1 &&(c=getchar())!=EOF&&c!='\n';++i)
{
line[i] = c;
}
if(c=='\n')
{
line[i]=c;
++i;
}
line[i] = '\0';
return i;
}
void copy(){
int i;
extern char line[];
extern char longest[];
i=0;
while((longest[i]=line[i])!='\0')
++i;
}
答案 2 :(得分:0)
在这里运行正常,但我认为你缺少的是你需要将EOF发送到getchar()以退出循环。
我认为你在Linux上运行它,对吧?如果是这样,只需在空行上按CTRL-D(这意味着在Linux / Unix上为EOF),程序将退出循环并打印出最长的行。