0

我从 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”。所以它肯定是在计算行长。

4

3 回答 3

5

事实上它确实如此,但它不会停止读取行,直到您键入文件结尾字符。

这是 Unix/Mac 上的 ^D 和 Windows 上的 ^Z。(但请注意,Windows 并没有真正实现终端 EOF,因此取决于您的库或 Cygwin 之类的东西来解释 ^Z。)

如果您的窗口仅在程序运行时处于活动状态,我想sleep(5)在 main() 的最后一个可能是一个好主意。最好从长期存在的窗口(如 Mac 上的终端或 Windows 上的 DOS 框)运行这样的控制台 I/O 程序。

于 2011-07-05T00:48:01.600 回答
0

getline返回的值比预期的高 1,因此如果用户只是按 Enter 键,它不会退出循环。此外,在您的函数中添加getch()之前,控制台在打印最长的行后退出/折叠。许多书籍都有相同的示例,因此如果您希望控制台保持打开状态,请让用户在程序退出之前按下键。在这里,试试这些代码:return 0maingetch

#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;
      }
于 2011-07-05T00:44:46.440 回答
0

在这里工作正常,但我认为您缺少的是您需要将 EOF 发送到 getchar() 以退出循环。

我想你是在 Linux 上运行的,对吧?如果是这样,只需在空行上按 CTRL-D(在 Linux/Unix 上表示 EOF),您的程序将退出循环并打印出最长的行。

于 2011-07-05T00:48:11.567 回答