这个C程序不起作用

时间:2011-07-05 00:38:38

标签: c console-application getchar

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

3 个答案:

答案 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),程序将退出循环并打印出最长的行。