В литерном массиве строк есть текст, содержащий слова, разделенные
пробелами. Предложения текста разделены точками. Длина записей в этом
массиве строке произвольная. Создать выходной массив строк, содержащий
текст, состоящий из записей строго одинаковой длины - 60 байт.
Исключение могут составлять записи, заканчивающиеся точкой - после
точки нужно вывести в выходной массив строк признак конца записи.Добавлено (23.05.11, 18:47)
---------------------------------------------
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define KEY_CTRL_Z 0x1A
#define KEY_ENTER 0xD
#define KEY_POINT '.'
#define KEY_SPACE ' '
int _tmain(int argc, _TCHAR* argv[])
{
puts("Vvedite text, dlya okonchaniya vvoda nazhmite Ctrl+z");
char ** sout = 0; //массив строк (для результата)
int size = 0; //размер sout
int count = 0; //реальное количество строк
int step = 10; //приращение size если количество строк становится равно размеру
int it = 0; //текущей индекс в строке
int mlen = 10; //максимальная длина строки при разбиении
bool skip = false; //метка: пропускать запись пробела в начале строки или нет
while(true) //бесконечный цикл
{
char c = getch(); //читаем очередной символ
if (c == KEY_CTRL_Z) //если символ указвыает на завершение ввода
{
sout[count][it] = 0; //указываем конец текущей строки
count++; //пересчитываем количество
break; //вышли из цикла
}
putch©; //выводим прочитанный символ
if (it == mlen) //если индекс равен макс длине строки то
{
sout[count][it] = 0; //указываем конец строки
count++; //переходим на следующую строку
it = 0; //переходим на начало строки
skip = true; //отметились
}
if (size == count) //если массив строк заполнен то
Добавлено (23.05.11, 18:47)
---------------------------------------------
продолжение
{
int i = size; //индекс последней строки + 1
size += step; //увеличиваем размер
sout = (char**)realloc(sout, size * sizeof(char**)); //перевыделяем память
for (; i < size; i++) //проходимся по всем новым элементам
{
sout[i] = new char[mlen + 1]; //выделяем память
}
}
if (c == KEY_POINT) //если ввели точку
{
sout[count][it] = KEY_POINT; //записываем ее
sout[count][it + 1] = 0; //указываем, что после точки конец строки
count++; //переходим на следующую строку
it = 0; //и на начало строки
skip = true; //отметились
}
else //иначе прчитан обычный символ
{
if (c == KEY_ENTER) //если это перевод строки
{
putch(0xA); //чтобы в консоли нормально перевелось
c = KEY_SPACE; //подменяем символ на пробел
skip = true; //отметились
}
if (skip) //если можно пропустить пробел
{
skip = false; //если еще будут пробелы то их уже не пропустим
if (!it && c == KEY_SPACE) //если мы хотим записать в начало строки пробел то
{
continue; //не делаем этого, переходим на начало цикла
}
}
sout[count][it] = c; //записали символ
it++; //перешли к следующему
}
}
printf("\n\nlines = %d\n\n", count); //вывели количество строк в новом разбиении
for (int i = 0; i < count; i++) //для каждой строки
{
printf("%s\n", sout[i]); //вывели ее
}
for (int i = 0; i < count; i++) //для каждой строки
{
delete sout[i]; //удалили ее
}
delete sout; //удалили массив
system("pause"); //ждем пользователя
return 0;
}