Не правильно работает функция GetSubstring для русского текста - C (СИ)
Формулировка задачи:
Не правильно работает функция GetSubstring. Подскажи пожалуйста в чём причина.
#include <stdio.h> #include <Windows.h> #include <string.h> #define FALSE 0 #define TRUE 1 #define MaxString 1000 #define MaxLength 1000 int main(void) { char buffer[MaxLength], substring[MaxLength]; char *bf=NULL, *ss=NULL; int i=FALSE; int GetLine(char *bf,char *ss); bf=buffer; ss=substring; while (i<MaxString){GetLine(bf,ss); i++;} return FALSE; Sleep(100000); } int GetLine(char *bf,char *ss) {char c; int i,length; void GetSubstring(char *bf, int length,char *ss); for(i=0;(i<MaxLength)&&((c=getchar())!=EOF)&& (c!='\n');i++) *(bf+i)=c; *(bf+i)='\0'; length=i; printf("BUFFER %s\n",bf); GetSubstring(bf,length,ss); return FALSE; } void GetSubstring(char *bf, int length,char *ss) {int i,IsSubString=FALSE; int counter=0; for(i=0;i<length;i++) {//if (('А'<=*(bf+i)<='Я')||('а'<=*(bf+i)<='я')) if ((*(bf+i)<='Я' && *(bf+i)>='А')||(*(bf+i)<='я' && *(bf+i)>='а')) {*(ss++)=*(bf+i); IsSubString=TRUE; counter++; printf(" There are substrings %d %d \n", counter,length);} else if (IsSubString == FALSE) printf("No substrings %d %d\n", counter,length);} if (IsSubString) *ss='\0'; printf("substring %s",ss); }
Решение задачи: «Не правильно работает функция GetSubstring для русского текста»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> #define MaxLength 1000 #define MaxString 1000 void GetSubstring(void); int main(void){ unsigned int i=0; for(i=0;i<MaxString;i++) GetSubstring(); system("pause"); return 0; } void GetSubstring(void){ struct arrayi{char *str;int start, end;} *arr = NULL; unsigned int arraysize=0; unsigned int bufi=0; unsigned int arri=0; char *buf = (char*)malloc(MaxLength); memset(buf, 0, MaxLength); char c; int ci=-1; while(1){ if((((c=getchar())!=EOF) && (c!='\n')) && bufi<MaxLength){ ci++; if (((c>=0xffffff80) && (c<=0xffffff9f) )||( (c>=0xffffffa0) && (c<=0xffffffef))){ if(bufi==0){ arraysize++; if(arr != NULL) arr = (struct arrayi*)realloc((void *)arr, sizeof(struct arrayi)*arraysize); else arr = (struct arrayi*)malloc(sizeof(struct arrayi)*arraysize); arr[arri].start = ci; } buf[bufi] = c; bufi++; }else{ if(bufi > 0){ buf[bufi]='\0'; arr[arri].str = (char*)calloc((unsigned int)strlen(buf)+1, 1); strcpy(arr[arri].str, buf); arr[arri].end = ci; arri++; bufi=0; memset(buf, 0, MaxLength); } } }else{ if(bufi > 0){ buf[bufi]='\0'; arr[arri].str = (char*)calloc((unsigned int)strlen(buf)+1, 1); strcpy(arr[arri].str, buf); arr[arri].end = ci; bufi=0; } delete(buf); break; } } printf("\r\nFound substrings %d\r\n", arraysize); for(arri=0; arri<arraysize; arri++){ printf("Substrings #%d (%d, %d): %s\r\n", arri+1, arr[arri].start, arr[arri].end, arr[arri].str); } for(arri=0; arri<arraysize; arri++){ delete(arr[arri].str); } if(arr != NULL) delete(arr); }
Объяснение кода листинга программы
- В этом коде реализована функция
GetSubstring
, которая принимает ввод пользователя (предположительно строку на русском языке) и разделяет ее на подстроки. - Подстроки сохраняются в динамическом массиве структур
arrayi
. - Каждая структура
arrayi
содержит указатель на строку, индексы начала и конца подстроки в исходной строке. - Ввод пользователя считывается в буфер, пока не будет введен символ новой строки или не будет достигнута максимальная длина буфера.
- Если введенный символ является русским символом, его добавляют в буфер.
- Когда в буфере собирается достаточно символов для создания подстроки, буфер очищается, и в массив структур
arrayi
добавляется новая структура с этой подстрокой. - После окончания ввода, все подстроки выводятся на экран.
- Массив структур
arrayi
и буфер освобождаются с помощью функцииdelete
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д