2016-02-24 6 views
0

работает на K & R упражнение 1-19:K & R Упражнение 1-19 неожиданный и противоречивый выход

Напишите программу, которая переворачивает его входной линии одновременно.

написал следующую программу:

#include <stdio.h> 
#define MAXLINE 1000 

main() { 
    int c, x, y, z; 
    char ip[MAXLINE]; 
    char ln[MAXLINE]; 
    char rv[MAXLINE]; 

    for (x = 0;(c=getchar()) != EOF; ++x)  
     ip[x] = c; 

    for (x = 0; ip[x] != '\0'; ++x) {    
     for (y = 0; ip[x] != '\n'; ++y) {   
      ln[y] = ip[x]; 
      ++x; 
     } 

     for (z = 0; y != -1; ++z) {     
      rv[z] = ln[y]; 
      --y; 
     } 
     printf("%s\n", rv);       
    } 
} 

Моя проблема заключается в том, что выход этой программы дико противоречивы; с учетом того же ввода (несколько строк), иногда он будет печатать каждую строку в обратном направлении с добавленным ведущим пустым пространством, иногда он будет воспроизводить только первую строку в обратном порядке, за которой следует пустые строки, иногда она печатает мусор, а иногда я просто получаю сообщение об ошибке.

Неужели кто-то сталкивается с такой волатильностью, не меняя своего кода? Как это исправить?

+0

В прошлый раз вы опубликовали довольно много связанных вопросов. Пожалуйста, подумайте о том, чтобы использовать другой (и более поздний - C развился много с момента последнего обновления K & R) книги и/или учебника. переполнение стека не является учебным сайтом. – Olaf

+2

Рассмотрите это, во втором цикле вы проверяете нулевые символы в 'ip'. Вы установили нулевой символ, когда вы его читали? –

+2

Вы читаете весь ввод в 1000-байтовый буфер, не проверяя, является ли вход больше 1000 байтов. Вы не '' \ 0'' завершаете строку 'ip', но цикл' x' ищет 'ip [x]! = '\ 0''. И вы не положили '' \ 0'' в конец строки 'rv', что означает, что' printf' будет проходить за конец строки. – user3386109

ответ

0

Если вы делаете K & R, я бы порекомендовал вам купить «C Answer Book», в котором есть все ответы на его упражнения.

Попробуйте это:

#include <stdio.h> 

#define MAX_LINE 1024 

void discardnewline(char s[]) 
{ 
    int i; 
    for(i = 0; s[i] != '\0'; i++) 
    { 
    if(s[i] == '\n') 
     s[i] = '\0'; 
    } 
} 

int reverse(char s[]) 
{ 
    char ch; 
    int i, j; 

    for(j = 0; s[j] != '\0'; j++) 
    { 
    } 

    --j; 

    for(i = 0; i < j; i++) 
    { 
    ch = s[i]; 
    s[i] = s[j]; 
    s[j] = ch; 
    --j; 
    } 

    return 0; 
} 

int getline(char s[], int lim) 
{ 
    int c, i; 

    for(i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i) 
    { 
    s[i] = c; 
    } 

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

    s[i] = '\0'; 

    return i; 

} 

int main(void) 
{ 
    char line[MAX_LINE]; 

    while(getline(line, sizeof line) > 0) 
    { 
    discardnewline(line); 
    reverse(line); 
    printf("%s\n", line); 
    } 
    return 0; 
} 

Некоторая часть его из книги, но я даже сделал свои собственные модификации.