Конкатенация строк.
char *concat(char **s, int n)
{
...
}
Здесь s – указатель на массив соединяемых строк, n – количество строк в массиве. Функция должна создавать в динамической памяти новую строку, размер которой равен суммарному размеру всех соединяемых строк, записывать в неё соединяемые строки друг за другом в том порядке, в котором они перечислены в массиве, и возвращать указатель на новую строку.
Программа concat.c, демонстрирующая работоспособность функции concat, должна считывать со стандартного потока ввода количество строк и сами соединяемые строки и выводить в стандартный поток вывода результирующую строку.
Пример входных данных программы:
4
One,
two,
three,
and four
Для этих данных программа должна выводить в стандартный поток вывода строку
One,two,three,and four
Ну классное задание. И?
Собственно, непонятно, как задать массив строк =( И осуществить считывание из потока ввода, ведь строчки разной длинны.
Если я правильно понял, то сначала мы должны задать массив строчек, а потом фун-ии дать на него указатель.
Код:
char **strings = (char **)malloc(sizeof(char*) * N); // вот массив ты уже и задал
(N - количество строк).
После этого - два варианта развития:
1. Ты считаешь, что длина строки не может быть больше, чем, скажем, некая константа MAX_CHARS_IN_LINE. Тогда выделяешь память для каждой строки в массиве длиной MAX_CHARS_IN_LINE, обнуляешь и читаешь с помощью scanf().
2. Ты читаешь по одному символу из stdin и, как только встречаешь перевод строки / перевод каретки, переходишь на новую строку.
Что еще мешает реализовать задание? Книги читал?
ЗЫ: делал с файлом чтобы отладку проще сделать, поэтому с клавы ввод сам организуй. Чтение строки из консоли делаем с помощью [COLOR="#8b0000"]cin.getline(буфер куда читаем,размер буфера, разделитель до которого читаем)[/COLOR]
[CODE=С++]#include<iostream>
#include<cstring>
using namespace std;
char *myconcat(char **Arr, int size);
int main()
{
FILE *in=fopen("lines.txt","r");
if(!in)
{
cout<<"Open file error"<<endl;
cout<<endl;
system("pause");
return -1;
}
char s[200];
int col=0;
fgets(s,200,in);
while(!feof(in))
{
col++;
fgets(s,200,in);
}
rewind(in);
char **Arr=new char*[col];
fgets(s,200,in);
int idx=0;
while(!feof(in) && idx<col)
{
int len=strlen(s);
Arr[idx]=new char[sizeof(s)];
strcpy(Arr[idx],s);
idx++;
fgets(s,200,in);
}
cout<<"String Arrays:\n";
for(int idx=0;idx<col;idx++)
cout<<Arr[idx];
for(int idx=0;idx<col;idx++)
{
Arr[idx]=strtok(Arr[idx],"\n");
}
cout<<"Rezult:\n"<<myconcat(Arr,col);
cout<<endl;
system("pause");
for(int idx=0;idx<col;idx++)
delete []Arr[idx];
delete []Arr;
return 0;
}
char *myconcat(char **Arr, int size)
{
int TotalLen=0;
for(int idx=0;idx<size;idx++)
{
int len=strlen(Arr[idx]);
TotalLen+=len;
}
char *rez=new char[TotalLen];
int TL=0;
for(int idx=0;idx<size,TL<TotalLen;idx++)
{
int len=strlen(Arr[idx]);
for(int jdx=0;jdx<len;jdx++)
{
rez[TL]=Arr[idx][jdx];
TL++;
}
}
rez[TL]='\0';
return rez;
}[/CODE]