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 Опубликовано 30 мая, 2006 Автор Жалоба Поделиться Опубликовано 30 мая, 2006 Собственно, сабж. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
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(); } Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.