Новичок
Профиль
Группа: Участник
Сообщений: 4
Регистрация: 27.12.2007
Репутация: нет Всего: нет
|
У меня есть задание (ниже), по нему писал курсовик. функция обработки (createNewStr) - не работает. Всегда все делаю сам и помогаю другим, но сейчас уже неделю не могу понять, в чем ошибка (и). Помогите пожалуйста. Загрузил срр файл. | Код | /* Работу выполнил: студент группы 7307 Орехов В.В.
Задание: Удалить из заданного текста заданное слово и, если в данной строке встречалось данное слово, то после данной строки вставить заданную строку
*/
#include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> #include <alloc.h>
//Основные функции int mainMenu(void); //Функция вывода меню, возвращает //выбранный пункт //Функции ввода char **inputText(int *); //Функция ввода текста вариант 2 char *inputStr(void); //Функция ввода строки char *inputWord(void); //Функция ввода слова
//Функции вывода void outputText(char **, int); //Функция вывода текста void outputWord(char *);//Функция вывода слова
//Функции обработки char **createNewStr(char **, char *, char *, int *);//Функция для обработки строки
//Вспомогательные функции int checkChar(char *StrF);//Функция проверки символа void freeMem2(char **, int);//освобождение памяти, выделенной под двойной указатель void freeMem1(char *mas);//освобождение памяти, выделенной под указатель
void main (void) { int menuAns; //Селектор меню
int ans1=1; //Переменная, отвечающая за выход из программы char *Str=NULL; //указатель на область динамической памяти для хранения //строки после ввода char **text=NULL; //указатель на область динамической памяти для хранения //строки после ввода char *Word=NULL; //указатель на область динамической памяти для хранения //слова после ввода char **newStr=NULL; int vvod1, vvod2, vvod3;//переменные для защиты от преждевременного выполнения int n, m, i;// n - количество строк в исходном тексте, m - количество строк в обработанном тексте
do { menuAns=mainMenu(); switch(menuAns) { case 1: //Ввод текста freeMem2(text, n); text=inputText(&n); m = n; break; //----------------------------------------------------------- case 2: if(text!=NULL)//если строка введена { clrscr(); outputText(text, n); } else { puts("\nStroka vvedena nekorrektno ili ne vvedena"); getch(); } break; //----------------------------------------------------------- case 3: freeMem1(Str); inputStr(); Str=inputStr();
break; //----------------------------------------------------------- case 4: if(Str!=NULL&&*Str!='\0') outputWord(Str); break; //----------------------------------------------------------- case 5: //Ввод слова freeMem1(Word); inputWord(); Word=inputWord(); break; //----------------------------------------------------------- case 6: if(Word!=NULL)//если слово введено { outputWord(Word); } else { puts("\nSlovo vvedeno nekorrektno ili ne vvedeno"); getch(); } break; //----------------------------------------------------------- case 7: if(Word!=NULL&&text!=NULL)//если и строка, и слово введено { freeMem2(newStr, m); newStr=createNewStr(text, Word, Str, &m); } else { puts("\nVipolnite punkt 1 i 3"); getch(); } break; //----------------------------------------------------------- case 8: if(newStr!=NULL&&newStr!='\0')//если обработка массива проведена { clrscr(); outputText(newStr, n);
getch(); } else { puts("\nMassiv orabotannekorrektno ili ne obrabotan. Vipolnite punkt 5"); getch(); } break; //----------------------------------------------------------- case 9:
break; //----------------------------------------------------------- case 0: ans1=0; break; //----------------------------------------------------------- default: printf("\nNeizvestniy punkt"); getch(); break; } } while(ans1==1);
freeMem1(Word); freeMem2(text, n); freeMem1(Str); freeMem2(newStr, m);
} //======================================================================= int mainMenu(void) { int menuAnsF;//от Menu Answer. F - от Function => локальная переменная //функции
clrscr(); puts("\n Menu:"); puts("\n 1. Vvod texta."); puts("\n 2. Kontrolniy vivod texta."); puts("\n 3. Vvod stroki, kotoruyu neobhodimo vstavit\'"); puts("\n 4. Kontrolniy vivod stroki"); puts("\n 5. Vvod slova, kotoroe neobhodimo udalit\'."); puts("\n 6. Kontrolniy vivod slova."); puts("\n 7. Obrabotka texta."); puts("\n 8. Vivod rezultata."); puts("\n 9. Help.\n"); puts("\n 0. Vihod.\n"); scanf("%d",&menuAnsF); return(menuAnsF); }
char **inputText(int *n)//ввод текста { int i, j;
char **text=NULL; j=0; clrscr(); printf("\nVvedite TEXT:"); printf("\npo okonchanii nagmite Enter 2 raza\n"); do { text=(char**)realloc(text,(j+1)*sizeof(char*)); text[j]=(char*)malloc(80*sizeof(char)); fflush(stdin); gets(text[j]); j++; } while (text[j-1][0]!='\0'); j--; *n=j; return text; } //======================================================================= char *inputStr(void)//ввод строки { char b[81];//массив для хранения строки до ввода int i, exit=0; char ch; char *StrF;
clrscr(); puts("\nVvedite stroku (ne bolee 80 simvolov, bez znakov prepinaniya i probelov):\n");
do { i=0; do { ch=getchar(); b[i]=ch; i++; } while(i<80&&ch!='\n');//пока введено <81 символа и нет перехода на //следующую строку if(i>=80) { printf("stroka = 80 simvolov, vvedite stroku eshe raz"); getch(); StrF=(char*) malloc(sizeof(char)); *StrF='\0'; } else { StrF=(char*) malloc((strlen(b)+1)*sizeof(char)); b[i]='\0'; strcpy(StrF,b);//копирование строки b в строку StrF exit=1; } } while(exit==0); return(StrF); } //======================================================================= char *inputWord(void)//ввод слова { char b[81];//массив для хранения строки до ввода int i, bul, exit=0; char ch; char *StrF;
clrscr(); puts("\nVvedite slovo (ne bolee 80 simvolov):");
do { i=0; do { ch=getchar(); if(checkChar(&ch)==1) { b[i]=ch; i++; } } while(i<80&&ch!='\n');//пока введено <81 символа и нет перехода на //следующую строку if(i>=80) { printf("slovo = 80 simvolov, vvedite stroku eshe raz"); getch(); } else { StrF=(char*) malloc((strlen(b)+1)*sizeof(char)); b[i]='\0'; strcpy(StrF,b);//копирование строки b в строку StrF exit=1; } } while(exit==0); return(StrF); } //======================================================================= void outputWord(char *StrF)//вывод строки или слова { clrscr(); puts(StrF); getch(); } //======================================================================= void outputText(char **StrF, int n)//вывод текста { int i; clrscr(); for(i=0;i<n;i++) { puts(StrF[i]); } getch(); } //======================================================================= char **createNewStr(char **text, char *word, char *str, int *m) { int plus=0, M; int i=0, j=0;//перменные, характеризующие элемент исходного текста int ic=0, k=0;//переменные, характеризующие элемент формируемого массива int d=0;//положение символа в слове char **a, *b, **c;//рабочие адреса строки, слова и новой строки char *a1, *b1;
int bul; char **newStrF=NULL;
a=text; plus=0; c=newStrF; b=word; b1=word;//адрес первого символа слова for(i=0;i<M;i++) { a1=text[i];//адрес первого символа строки j=0;
if (newStrF==NULL) newStrF=(char **) malloc(sizeof(char*)); else newStrF=(char **) realloc(newStrF,(i+1)*sizeof(char*));
while(*a)//пока не конец строки { while(checkChar(a[i]+j)==0)//пропуск знаков препинания и пробелов { j++; } if(*a)//пока не конец строки { bul=1; while(checkChar(a[i]+j)!=0&&bul!=0&&*b) /*Пока в строке нет знаков препинания и пробелов и символ строки равен символу слова и не конец слова*/ { if(*(a[i]+j)==*(b+d))//если слово и слово в строке совпадают { j++; d++; } else { bul=0; } } if(bul==0)//если слово и слово в строке не совпали { while(checkChar(a[i]+j)!=0&&a[i]!=a1) /*пока символ строки - не знак препинания и не пробел переходим на символ назад*/ { j--; } j++; if(a[i]==a1) { j--; } while(checkChar(a[i]+j)!=0&&*a)//пока не разделитель-копируется слово { if (newStrF[ic]==NULL) newStrF[ic]=(char*) malloc(sizeof(char)); else newStrF[ic]=(char*) realloc(newStrF,sizeof(char)); *(c[ic]+k)=*(a[i]+j);//в новую строку записывается символ исходной строки
k++; j++; } while(checkChar(a[i]+j)!=1&&*a)//пока не буква-копируются разделители { if (newStrF[ic]==NULL) newStrF[ic]=(char*) malloc(sizeof(char)); else newStrF[ic]=(char*) realloc(newStrF,sizeof(char)); *(c[ic]+k)=*(a[i]+j);//в новую строку записывается символ исходной строки
k++; j++; } } else { plus=1; } b=b1;//переход на первую букву слова } } *(c[ic]+k)='\0'; ic++;//переход на след. строку в новом тексте }//конец цикла for printf("Massiv obrabotan"); getch(); *m=M;
outputText(newStrF, M); return (newStrF); }
//======================================================================= int checkChar(char *StrF)//проверка символа { int Boolean; if( *StrF==' ' || *StrF==',' || *StrF=='.' || *StrF=='!' || *StrF=='?' || *StrF==';' || *StrF==':' || *StrF=='!' || *StrF=='\'' || *StrF=='\"' || *StrF=='(' || *StrF==')' || *StrF=='*' || *StrF=='$' || *StrF=='#' || *StrF=='№' || *StrF=='@' || *StrF=='-' || *StrF=='^' || *StrF=='>' || *StrF=='<' || *StrF=='/' ) { Boolean=0; } else { Boolean=1; }
return Boolean; } //======================================================================= void freeMem2(char **mas, int N) /* Освобождение участка динамической памяти, выделенной под указатель на массив адресов */ { int i; //Освобождение выделенной ранее динамической памяти if(mas!=NULL) { for(i=0;i<N;i++) { free(mas+i); } free(mas); mas=NULL; } } //======================================================================= void freeMem1(char *mas) /* Освобождение участка динамической памяти, выделенной под указатель на массив символов */ { int i; //Освобождение выделенной ранее динамической памяти if(mas!=NULL) { free(mas); mas=NULL; } }
|
|