K& R节1.10示例程序跳过' printf()'线

时间:2015-04-08 19:24:34

标签: c

我正在通过K& K学习C语言R.我已经达到 1.10外部变量和范围。
在该部分中,他们编写并解释了有关外部变量及其范围的程序。我自己键入了该代码并尝试执行它。它不显示任何运行时或编译时错误。但是,它也不打印任何输出,这应该是来自给定输入的最长行。我调试了程序,发现程序正在跳过'printf()'语句。我尝试了 sublime text 2 + gcc和Turbo c ++ v4.5 ,但我仍然没有得到输出。我正在使用Windows xpsp 3.
这是我的代码:

#include<stdio.h>

/* program to pring longest line using external variables */

#define MAXSIZE 1000

int max;
char line[ MAXSIZE ];
char longest[ MAXSIZE ];

int getline( void );
void copy( void );

main()
{
    int len;

    extern int max;
    extern char longest[];

    max = 0;

    while( ( len = getline() ) > 0 )  
    {
        if( len > max )
        {
            len = max;
            copy();
        }
    }

    if( max > 0)
        printf("\n%s\n", longest);  /* This line is skipped */
    return 0;
}

int getline( void )  /* Check if there is line */
{
    int c, i;
    extern char line[];

    for( i = 0; i < MAXSIZE -1 && ( c = getchar()) != EOF &&  c != '\n'; ++i )
        line[ i ] = c;

     if( c == '\n' )
    {
        line[ i ] = c;
        ++i;
    }

    line[ i ] = '\0';

    return i;
}

void copy( void )  /* copy current line to longest if it is long */
{
    int i = 0;
    extern char line[];
    extern char longest[];

    while( ( longest[ i ] = line[ i ] ) != '\0' )
        ++i;
}

所以我的问题是:
为什么会这样? 我该怎么办才能使程序不会跳过'printf()'并输出输出?
请帮忙。谢谢。

1 个答案:

答案 0 :(得分:0)

此代码的意图是从零开始max,然后,对于比当前max更长的每一行,复制该行并更新max更长的价值:

max = 0;
while( ( len = getline() ) > 0 )  
{
    if( len > max )
    {
        len = max;
        copy();
    }
}

但是,应该更新max的行正在指向错误的方向。它将len设置为max的当前值,永远不会更新 max。这是一个显而易见的“调试101”,在调用copy()之后放置以下行:

printf ("New long line, len = %d, str = '%s'\n", max, longest);

你永远不会看到长度变化的事实会(希望)很快缩小问题的范围。相关的行应该是:

max = len;