Ошибка при размещении символов в строке в обратном порядке
#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;
}