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

Объяснение кода листинга программы

  1. В этом коде реализована функция GetSubstring, которая принимает ввод пользователя (предположительно строку на русском языке) и разделяет ее на подстроки.
  2. Подстроки сохраняются в динамическом массиве структур arrayi.
  3. Каждая структура arrayi содержит указатель на строку, индексы начала и конца подстроки в исходной строке.
  4. Ввод пользователя считывается в буфер, пока не будет введен символ новой строки или не будет достигнута максимальная длина буфера.
  5. Если введенный символ является русским символом, его добавляют в буфер.
  6. Когда в буфере собирается достаточно символов для создания подстроки, буфер очищается, и в массив структур arrayi добавляется новая структура с этой подстрокой.
  7. После окончания ввода, все подстроки выводятся на экран.
  8. Массив структур arrayi и буфер освобождаются с помощью функции delete.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.333 из 5
Похожие ответы