Ошибка при размещении символов в строке в обратном порядке

#include <stdio.h>
#include <locale.h>
void reverse(char s[]);
main()
{
    setlocale(LC_ALL, "RUS");
    char array[1024];
    char rev[1024];
    int i, r, len;
    char c;
    i = r = len = 0;
    while ((c = getchar()) != EOF)
    {
        array[i] = c;
        i++;
        len = i;
    }
    for (i = 0; i <= len; i++)
    {
        if (array[i] != '\n')
        {
            rev[r] = array[i];
            r++;
        }
        else
        {
            rev[r] = '\n';
            reverse(rev);
            r = 0;
        }
    }
    return 0;
}
void reverse(char s[])
{
    int i, len;
    i = len = 0;
    for (i = 0; s[i] != '\n'; i++)
    len = i;
    for (i = i - 1; i >= 0; i--)
        printf("%c", s[i]);
    printf('\n');
}

Код работает верно, то есть выводит строку в обратном порядке, но после конца ввода строки возникает ошибка "Вызвано исключение по адресу 0x00007FFC105698A4 (ucrtbased.dll) в Project1.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x000000000000000A.".

Может кто-нибудь подсказать, как избавиться от этой ошибки?


Ответы (2 шт):

Автор решения: Maggot

а зачем Вам такая реализация реверс? можно же написать проще

#include <stdio.h>
#include <string.h>

void swap(char* p1, char* p2) {
  if (p1 == NULL || p2 == NULL) {
    return;
  }
  char t = *p1;
  *p1 = *p2;
  *p2 = t;
}

void reverse(char* ptr, size_t size) {
  if (ptr == NULL) {
    return;
  }
  char* end_ptr = ptr + size;
  while (ptr != end_ptr && (ptr != --end_ptr)) {
    swap(ptr, end_ptr);
  }
}

int main() {
  char mess[] = "abrabrabr";
  printf("%s\n", mess);
  reverse(mess, strlen(mess));
  printf("%s\n", mess);

  return 0;
}
→ Ссылка
Автор решения: Генс

Первое что бросается в глаза в последнем printf('\n') нужны двойные "". Компилятор сразу выдаст ошибку. Непонятно так же зачем мучится без #include <string.h>? Так будет проще.

#include <stdio.h>
#include <string.h>
#include <windows.h>
void  reverstrok(char a[],char b[]);
void  reverstrok(char a[],char b[])
{
int x,i;
for (x=0,i=(strlen(a)-1);x<strlen(a);x++,i--)
b[x]=a[i];
b[x]='\0' ;
}
int main(void)
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
int i,x;
char str[50];//В [] количество элементов массива +'\0'
    printf("Bвод строки:\n");
while ((str[i]=getchar())!= '.')
i++;
str[i++]='.';
str[i]='\0';
char s[strlen(str)+1];
    printf("Строка - \"%s\"\n",str);
    reverstrok(str,s);
    printf("Реверс - \"%s\". Длина - %d символов "
           "Размер - %d байт.\n",s,strlen(s),sizeof(s));
return 0;
}
→ Ссылка