Guard Опубликовано 29 мая, 2006 Жалоба Опубликовано 29 мая, 2006 Задание: Функция получает массив указателей на строки и возвращает строку в динамической памяти, содержащую ОБЪЕДИНЕННЫЙ текст из входных строк. Попытка реализации: #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(); } Вопрос - в чем ошибка? Цитата
Sleeping Daemon Опубликовано 29 мая, 2006 Жалоба Опубликовано 29 мая, 2006 gets(a) Куда указывает a ? То же для b. Да и массивом указателей здесь и не пахнет. Цитата
Guard Опубликовано 1 июня, 2006 Автор Жалоба Опубликовано 1 июня, 2006 Потихоньку получается. Но теперь возник вопрос. Как обратится к элементу массива указателей. К примеру вывести его на экран. Цитата
Sleeping Daemon Опубликовано 1 июня, 2006 Жалоба Опубликовано 1 июня, 2006 Guard писал(а) Чтв, 01 Июня 2006 12:01 Потихоньку получается. Но теперь возник вопрос. Как обратится к элементу массива указателей. К примеру вывести его на экран. Элемент массива указателей - суть число(адрес элемента на который этот указатель ссылается). Как вывести число - это уж Вы сами смотрите. Цитата
Guard Опубликовано 2 июня, 2006 Автор Жалоба Опубликовано 2 июня, 2006 Еще вопрос. Имеется функция: #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); // а дальше? } Цитата
Ineu Опубликовано 2 июня, 2006 Жалоба Опубликовано 2 июня, 2006 Guard писал(а) Птн, 02 Июня 2006 14:01 Еще вопрос. Имеется функция: 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 не присваиваете возвращаемое ей значение ничему? Ваше loadfile(f) - то же самое, что (void)loadfile(f). Имхо, Вам все-таки не это надо main() { char **x; ...fopen()... x = loadfile (f); .... } Вот так. Я пользуюсь malloc'ом, поэтому не знаю, где резервирует память new. По идее, указатель должен вернуться нормальный. ЗЫ. Хотя мне все равно такая конструкция не очень по душе, гарантировать работу не могу Цитата
Guard Опубликовано 2 июня, 2006 Автор Жалоба Опубликовано 2 июня, 2006 Вроде работает. Спасибо. Цитата
Guard Опубликовано 2 июня, 2006 Автор Жалоба Опубликовано 2 июня, 2006 #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 ом - все работало. Цитата
EL[michlen] Опубликовано 3 июня, 2006 Жалоба Опубликовано 3 июня, 2006 Функция f() изначально неправильна. Сравнение вида s[i+1]!=NULL должно как минимум вызывать исключение access violation. А валится на strcat(s[0], s[i+1]); и вызывает именно это исключение по той же причине Касательно самой программы: если это не противоречит заданию, я бы использовал std::string - было бы в сто раз удобнее и безопаснее с точки зрения памяти. Цитата
Guard Опубликовано 5 июня, 2006 Автор Жалоба Опубликовано 5 июня, 2006 Конечная версия. Может кому пригодится... #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(); } Цитата
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.