2016-09-22 3 views
1

Я учусь и решения упражнений из K & R. Я переписал программу, указанную в разделе 1.9,Невозможно вывести длинная строка

Постановка задачи: написать программу, которая считывает набор строк текста и печатает длинный ,

Программа:

#include <stdio.h> 
#define MAX 100 

int getlinetext(char s[]); 

int main(void) 
{ 
    char longest[MAX]; 
    int longestlenght = 0; 
    char line[MAX]; 
    int lenght; 

    while ((lenght = getlinetext(line)) > 0){ 
     if(lenght > longestlenght){ 
      longestlenght = lenght; 
      int i = 0; 
      while (line[i] != '\0'){ 
       longest[i] = line[i]; 
       i++; 
      } 
      longest[i] = '\0'; 
     } 
    } 
    printf("The longest lenght is %d\n", longestlenght); 
    printf("%s\n", longest); 
    return 0; 
} 

int getlinetext(char line[]) 
{ 
    int i=0; 
    int c; 
    while ((c = getchar()) != EOF){ 
     line[i] == c; 
     if (c == '\n') 
      break; 
     i++; 
    } 
    line[i] = '\0'; 
    return i; 
} 

Ожидаемый результат:

hello 
world!! 
The longest lenght is 7 
world!! 

Фактический выход:

hello 
world!! 
The longest lenght is 7 
� 

Какой-то образом, я могу напечатать правильную длинную длину, но не сама строка. Я думал, что пропущу нулевой байт, но он там, и ошибка все еще сохраняется.

+0

Пожалуйста, укажите ввод, ожидаемый выход и фактический выход. – piyushj

+0

Это менее 100 символов. – x899

+0

Я отредактировал вопрос. Пожалуйста, проверьте. – x899

ответ

0

Как @chux отметил, я сделал глупую ошибку, используя знак равенства («==») вместо присваивания знака («=») на линии № 34:

line[i] == c -> line[i] = c 

Так скорректированная программа будет

#include <stdio.h> 
#define MAX 100 

int getlinetext(char s[]); 

int main(void) 
{ 
    char longest[MAX]; 
    int longestlenght = 0; 
    char line[MAX]; 
    int lenght; 

    while ((lenght = getlinetext(line)) > 0){ 
     if(lenght > longestlenght){ 
      longestlenght = lenght; 
      int i = 0; 
      while (line[i] != '\0'){ 
       longest[i] = line[i]; 
       i++; 
      } 
      longest[i] = '\0'; 
     } 
    } 
    printf("The longest lenght is %d\n", longestlenght); 
    printf("%s\n", longest); 
    return 0; 
} 

int getlinetext(char line[]) 
{ 
    int i=0; 
    int c; 
    while ((c = getchar()) != EOF){ 
     line[i] = c; 
     if (c == '\n') 
      break; 
     i++; 
    } 
    line[i] = '\0'; 
    return i; 
} 
+1

Это не будет последний раз, когда вы совершите эту ошибку (но ваш компилятор должен предупредить вас об этом) ':)' Также 'lenght' на самом деле написано' length' (это не имеет никакого значения для вашего кода, но выглядит wonky ...) –

+0

@ DavidC.Rankin @chux Я использую gcc на linux. И для компиляции я использовал 'gcc -o test test.c'. gcc никогда не предупреждал меня. – x899

+0

Вы должны использовать 'gcc -Wall -Wextra -O2 -o test test.c', если вы хотите, чтобы все предупреждения добавляли' -pedantic', если вы хотите, чтобы полная оптимизация использовалась '-Ofast' (доступно ** gcc> = 4.6 * *, перед использованием '-O3'). Оптимизированный код может работать на несколько сотен процентов быстрее. «-Wall -Wextra» включит предупреждения, и вы должны устранить все предупреждения, прежде чем считать свой код надежным. Предупреждения на самом деле довольно хорошо написаны, после того как вы работаете с ним некоторое время ... –