Не правильно работает функция 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.