Перейти к содержанию

Рекомендуемые сообщения

Опубликовано

Задание: Функция получает массив указателей на строки и возвращает строку в динамической памяти, содержащую ОБЪЕДИНЕННЫЙ текст из входных строк.

Попытка реализации:

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

char *f(char *a, char *b, char *c)
{
int n;
n=strlen(a)+strlen(;
c=new char[n+2];
strcpy(c, a);
strcat(c, ;
return c;
}

void main()
{
   clrscr();
   char *a, *b, *c;
   printf("\nVvedite massiv 1: ");
   gets(a);
   printf("\nVvedite massiv 2: ");
   gets(;

   f(a,b,c);
   printf("\nItog: ");
   puts©;
   getch();
}

Вопрос - в чем ошибка?

Опубликовано

Guard писал(а) Чтв, 01 Июня 2006 12:01

Потихоньку получается. Но теперь возник вопрос. Как обратится к элементу массива указателей. К примеру вывести его на экран. Confused

Элемент массива указателей - суть число(адрес элемента на который этот указатель ссылается).

Как вывести число - это уж Вы сами смотрите.

Опубликовано

Еще вопрос. Smile

Имеется функция:

#define SIZE0 10                           // Кратность размерности ДМУ

char **loadfile(FILE *fd){
char str[80];
char ** pp = new char* [size0];                 // Создать динамический
if (pp ==NULL) return(NULL);                       // массив указателей
     for ( int i=0; fgets(str,80,fd) !=NULL; i++) {
     pp = new char [strlen(str)+1];          // Создать динамический
     if (pp==NULL) return NULL;                 // массив символов и
     strcpy(pp,str);                       // копировать туда строку
          if ((i+1) % SIZE0 ==0) {        // Расширить при переполнении
          pp = (char**) realloc( (void*) pp,sizeof(char*)*(i+1+SIZE0));
          if (pp ==NULL) return NULL;
          }}
pp = NULL;                        // Ограничитель массива указателей
return pp; }

После ее вызова в main'е как обратится к массиву указателей char **pp?

То есть:


void main()
{
FILE *f=fopen("base.txt", "w+");
loadfile(f);
// а дальше?
}
Опубликовано

Guard писал(а) Птн, 02 Июня 2006 14:01

Еще вопрос. Smile

Имеется функция:

char **loadfile(FILE *fd){
...
char ** pp = new char* [size0];  
...
return pp; }

После ее вызова в main'е как обратится к массиву указателей char **pp?

То есть:

void main()
{
FILE *f=fopen("base.txt", "w+");
loadfile(f);
// а дальше?
}

А зачем Вы в функции возвращаете pp, если в main не присваиваете возвращаемое ей значение ничему? Smile Ваше loadfile(f) - то же самое, что (void)loadfile(f). Имхо, Вам все-таки не это надо Smile

main()

{

char **x;

...fopen()...

x = loadfile (f);

....

}

Вот так. Я пользуюсь malloc'ом, поэтому не знаю, где резервирует память new. По идее, указатель должен вернуться нормальный.

ЗЫ. Хотя мне все равно такая конструкция не очень по душе, гарантировать работу не могу Razz

Опубликовано
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <alloc.h>

#define M 10


char **l(){
char c[80];
char **pp=new char*[M];             // Первоначальный массив указателей
     for (int i=0;gets©,c[0]!=0;i++){        // Ввод до пустой строки
     pp=new char[strlen©+1];     // Создание динамического массива
     strcpy(pp,c);                    // и копирование в него строки
	  if ((i+1)%M==0){              // Заполнен последний указатель
	  char **qq = new char* [i+1+M];
	  for (int j=0; j<=i; j++)           // Копировать указатели из
	  qq[j]=pp[j];                           // старого ДМУ в новый
	  delete pp;                              // Удалить старый ДМУ
	  pp=qq;                             // Считать новый за старый
	  }


     }
pp=NULL;

return pp;}                  // Возвратить указатель на ДМУ


char *f(char **s)
{
 for(int i=0; s[i+1]!=NULL; i++)
 {
 strcat(s[0], s[i+1]);
 }


return *s;
}

void n()
{
 char **p; char *q;
   printf("Vvedite stroki, kotorie nado obedinit': \n");
   p=l();     /*Валится на этой строчке.*/
   f(p);
   q=p[0];
   printf("Itog: ");
   printf("%s", q);

}


void main()
{
clrscr();


   printf("1.Rabota\n2.Exit\n");
int a=0;
scanf("%d",&a);
switch (a){
case 1:{n();break;}

}

   getch();

}

По заданию в main дожно быть меню. Когда функция n была собственно main ом - все работало.
Опубликовано

Функция f() изначально неправильна. Сравнение вида s[i+1]!=NULL должно как минимум вызывать исключение access violation. А валится на strcat(s[0], s[i+1]); и вызывает именно это исключение по той же причине Smile

Касательно самой программы: если это не противоречит заданию, я бы использовал std::string - было бы в сто раз удобнее и безопаснее с точки зрения памяти.

Опубликовано

Конечная версия. Может кому пригодится... Smile

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

#define M 10


char **l(){
char c[80];
char **pp=new char*[M];             // Первоначальный массив указателей
     for (int i=0;gets©,c[0]!=0;i++){        // Ввод до пустой строки
     pp=new char[strlen©+1];     // Создание динамического массива
     strcpy(pp,c);                    // и копирование в него строки
	  if ((i+1)%M==0){              // Заполнен последний указатель
	  char **qq = new char* [i+1+M];
	  for (int j=0; j<=i; j++)           // Копировать указатели из
	  qq[j]=pp[j];                           // старого ДМУ в новый
	  delete pp;                              // Удалить старый ДМУ
	  pp=qq;                             // Считать новый за старый
	  }


     }
pp=NULL;

return pp;}                  // Возвратить указатель на ДМУ


char *f(char **s)
{

int l=0;
for(int i=0;s!=NULL;i++)
{
l+=strlen(s);
}
char* p=new char[l];
strcpy(p, s[0]);
for(int j=1; s[j]!=NULL; j++)
strcat(p, s[j]);

return p;
}


void main()
{
clrscr();

 char **p; char *q;
   printf("Vvedite stroki, kotorie nado obedinit': \n");
   p=l();
   q=f(p);
   printf("Itog: ");
   printf("%s", q);

getch();

}

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...