Проверить, является ли введенная строка полиндромом (справа-налево читается также как и слева-направо).
Пример динамического размещения при работе со строковыми данными в С
Динамическое размещение данных
Если в задаче заранее неизвестно количество объектов и объект описан указателем удобно использовать динамическое размещение данных.
Прототипы функций работы с памятью находятся в библиотеке alloc.h, рассмотрим основные из них:
void *calloc(unsigned n, unsigned m); - возвращает указатель на начало области памяти для размещения n элементов по m байт каждый, при неудачном завершении возвращает значение NULL;
void *malloc(unsigned n); - возвращает указатель на блок памяти длиной n байт, при неудачном завершении возвращает значение NULL;
void *realloc(void *bf, unsigned n); - изменяет размер ранее выделенной памяти с адресом начала bf на n байт;
void free(void *bf); - освобождает ранее выделенный блок памяти с адресом bf;
coreleft(void); - возвращает значение объема неиспользованной памяти (тип возвращаемого результата unsigned – для моделей памяти tiny, small, medium; unsigned long – для других моделей памяти).
Пример выделения памяти для массива действительных чисел размером n:
float *x; // Указатель объекта типа float – x[0]
int n; // Количество элементов массива
...
x=(float*)calloc(n,sizeof(float)); // Захват памяти для n элементов
...
free(x); // Освобождение памяти
В С++ введены две операции: захват памяти - new и освобождение захваченной ранее памяти - delete.
Общий формат записи:
указатель = new тип (значение);
...
delete указатель;
Например:
int *a;
a = new int (8);
данном случае создана целочисленная динамическая переменная, на которую установлен указатель a и которой присвоено начальное значение 8. После работы с ней освобождаем память:
delete a;
Операции new для массивов:
указатель = new тип [ количество ];
Результат операции – адрес начала области памяти для размещения данных, указанного количества и типа; при нехватке памяти – NULL.
Операция delete для массивов:
delete [ ] указатель;
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <calloc.h>
void main(void)
{
char *s;
int i, k;
clrscr();
puts(" Vvedi stroky");
gets(s);
k=strlen(s);
s=(char*)calloc(k,sizeof(char)); // Захват памяти для строки длиной k
for (i=0; i<(int)(k/2); i++)
if(s[i]!=s[k-i-1]) { puts("\n NO!!"); getch();
free(s); exit(0); }
puts("\n YES - Polindrom!");
getch();
free(s); // Освобождение памяти
}
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<alloc.h>
void main(void)
{ int i,n; float *a;
puts(“\n Input n:”);
scanf(“%d”,&n);
printf(“\n Свободная память -%d”,coreleft());
a=(float*)calloc(n,sizeof(float)); // Захват памяти
printf(“\n Array a \n”);
for(i=0; i<n; i++) {
*(a+i)=(float)random(10); // Диапазон от 0 до 10
printf(“ %d“, a[i]);
}
printf(“\n Память после захвата -%d”,coreleft());
free(a); // Освобождение памяти
getch();
}