Эта программа на C не работает - PullRequest
0 голосов
/ 05 июля 2011

Я скопировал следующий код C из K & R. Код должен печатать строку, если это самая длинная строка, набранная пользователем. Это код:

 #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;
      }

Проблема в том, что он не работает. Запустив код, я могу набирать строки в консоли, но она не печатает самую длинную строку. Буду признателен за любую помощь.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Я использую Win7 с компилятором Open Watcom. Консоль не складывается, она позволяет вводить символы. Кроме того, я не уверен, что застрял в цикле, потому что если я изменю свой цикл while в main () на

while((len = getline()) > 0)
        if (len > max){
            printf("IT WORKS");
            max = len;
            copy();
        }

с командой печати, если длина строки превышает текущую максимальную длину, то «IT WORKS» выводится на экран. Так что он определенно считает длину строки.

Ответы [ 3 ]

5 голосов
/ 05 июля 2011

На самом деле это так, но это не остановит чтение строк, пока вы не наберете конец файла .

Это ^ D наUnix / Mac и ^ Z в Windows.(Но обратите внимание, что Windows на самом деле не реализует Terminal-EOF, так что ваша библиотека или что-то вроде Cygwin может интерпретировать ^ Z.)

Если ваше окно активно только тогда, когда программа запущена, япредположим, что sleep(5) может быть хорошей идеей в самом конце main ().Было бы лучше всего запускать консольные программы ввода-вывода, подобные этой, из долгоживущего окна, такого как Terminal на Mac или в окне DOS в Windows.

0 голосов
/ 05 июля 2011

Здесь отлично работает, но я думаю, что вам не хватает того, что вам нужно отправить EOF в getchar (), чтобы выйти из цикла.

Я думаю, что вы работаете в Linux, верно?Если это так, просто нажмите CTRL-D (что означает EOF в Linux / Unix) на пустой строке, и ваша программа выйдет из цикла и выведет самую длинную строку.

0 голосов
/ 05 июля 2011

getline возвращает на 1 больше, чем ожидалось, поэтому, если пользователь просто нажимает Enter, он не выходит из цикла. Кроме того, добавьте 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;
      }
...