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

Как правильно?


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

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

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

#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();
}

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

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

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 эмодзи.

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

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

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

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