Строка не печатается на C. Даже при использовании символа '\ 0' - PullRequest
0 голосов
/ 07 апреля 2019

Я пытаюсь изменить вход в c.

Input: Hello World

Output: dlroW olleH

Actual Output: 

Я протестировал код с помощью putchar, и похоже, что он помещает правильные символы в правильную позицию, однако ничего не выводит. Код ниже:

#include <stdio.h>
#define MAXLEN 1000

int getLine(char s[]); 
void reverse(char r[], char s[], int len);

int main()
{
    char string[MAXLEN];                
    char reversed[MAXLEN];
    int len;

    while((len = getLine(string)) != 0)
    {
           reverse(reversed, string, len);
           printf("%s\n", reversed);
    }
    return 0;
}

int getLine(char line[])
{
    int i, c;
    i = 0; 
    while((c = getchar()) != EOF && c != '\n')
    {
          line[i] = c;
          i++;
    }

    line[i + 1] = '\0';
    return i;
}

void reverse(char r[], char s[], int len)
{
    int i;

    i  = 0;
    while(len >= 0)
    {
           r[i++] = s[len--];
    }
    r[i] = '\0';
}

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

Вы должны определить, что означает getLine(): длина .Это число символов, вставленных в массив, или количество символов, исключая '\ 0', которое завершает строку.Вот для чего нужны комментарии к коду:

int getLine(char line[])
{
    int i = 0, c;

    while ((c = getchar()) != EOF && c != '\n')
    {
        line[i++] = c;
    }

    line[i] = '\0';

    return i; // return array length, not counting final \0
}

Какое бы решение вы ни выбрали, это не имеет смысла:

r[i++] = s[len--];

В одном случае вы бы поместили символ завершения строки '\ 0'в качестве первого символа новой строки, всегда возвращающей пустую строку, или в другом случае вы бы скопировали мусорную память в новую строку.С точки зрения массива на основе индекса 0 длина должна означать единицу после последнего индекса.Таким образом, последний элемент в массиве должен быть s[len - 1].Вместо того, чтобы считать len, я советую вам рассчитывать на i, пока он не достигнет len:

void reverse(char r[], const char s[], size_t length)
{
    int i = 0;

    while (i < length)
    {
        r[i] = s[length - 1 - i];
        i++;
    }

    r[i] = '\0';
}
0 голосов
/ 07 апреля 2019

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

  1. Как уже упоминалось в комментариях, вам нужно использовать line[i] = '\0'; вместо line[i + 1] = '\0' для завершения нуля.
  2. В reverse() функция, вам нужно использовать r[i++] = s[--len]; вместо r[i++] = s[len--];.Если вы этого не сделаете, у вас будет недопустимый доступ к памяти.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...