Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
blackpantera
1 / 1 / 1
Регистрация: 06.06.2012
Сообщений: 38
1

Не правильно работает функция GetSubstring для русского текста

27.09.2012, 08:38. Просмотров 1306. Ответов 22
Метки нет (Все метки)

Не правильно работает функция GetSubstring. Подскажи пожалуйста в чём причина.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#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);
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.09.2012, 08:38
Ответы с готовыми решениями:

Составить алгоритм, подсчитывающий для заданного текста количество вхождений каждой буквы русского алфавита
Составить алгоритм, подсчитывающий для заданного текста количество вхождений...

Функция, описывающая массив, работает но не всегда правильно
Задание такое: Написать функцию, которая находит в массиве наименьшее...

Запись в файл русского текста, непонятная кодировка
Хочу написать программу, записывающую в файл введенный с консоли текст на...

Ввод русского текста из консоли в файл (проблема с кодировкой)
Здравствуйте! Стоит казалось бы тривиальная задача - считать из консоли...

Не правильно работает функция для заливки цветом, для Paint
Всем привет! Помогите пожалуйста с функцией заливки для паинт. Проблема такая,...

22
Evgen2sat
19 / 19 / 13
Регистрация: 22.11.2011
Сообщений: 101
28.09.2012, 08:48 2
blackpantera, ну, чтобы русские буквы выводились нужно #include <locale.h>
и в main написать setlocale(LC_ALL, "RUS");
с остальным пока не разобрался
2
blackpantera
1 / 1 / 1
Регистрация: 06.06.2012
Сообщений: 38
28.09.2012, 09:19  [ТС] 3
Я переделала функцию теперь всё работает только с английскими буквами. Попробую сделать как вы сказали. Только насчёт main не поняла, напишите строку. И вы не могли бы объяснить почему без этого не работает?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void GetSubstring(char *bf, int length,char *ss)
{int i,IsSubString=FALSE;
 int counter=0;
 
for(i=0;i<length;i++)
    {
    if ((*(bf+i)>='A' && *(bf+i)<='Z' )||( *(bf+i)>='a' && *(bf+i)<='z'))
        {*ss=*(bf+i);
        ss++;
        IsSubString=TRUE;
        counter++;
        printf(" There are substrings %d %d \n", counter,length);} 
 
    else printf("No substrings %d %d\n", counter,length);}
 
    
    if (IsSubString==TRUE)
    { *ss='\0' ;
    ss=ss-counter;printf("%c\n",*ss);
    printf("substring %s\n",ss);}
0
Evgen2sat
19 / 19 / 13
Регистрация: 22.11.2011
Сообщений: 101
28.09.2012, 15:56 4
blackpantera, примерно так
C
1
2
3
4
5
6
#include <locale.h>
...
int main(void)
{
setlocale(LC_ALL, "RUS");
...
Извините, не так выразился.
Цитата Сообщение от Evgen2sat Посмотреть сообщение
и в main написать setlocale(LC_ALL, "RUS");
setlocale(LC_ALL, "RUS"); используется для вывода русских символов
0
blackpantera
1 / 1 / 1
Регистрация: 06.06.2012
Сообщений: 38
28.09.2012, 18:27  [ТС] 5
У меня проблема не с выводом русских букв, а с самим условием. Компилятор когда компилирует не понимается русских символов. По таблицы ASCII должно работать вроде.
C
1
 if ((*(bf+i)>='а' && *(bf+i)<='я' )||( *(bf+i)>='А' && *(bf+i)<='Я'))
0
ProNoooob
77 / 77 / 8
Регистрация: 14.10.2009
Сообщений: 121
28.09.2012, 19:02 6
Цитата Сообщение от blackpantera Посмотреть сообщение
if ((*(bf+i)>='а' && *(bf+i)<='я' )||( *(bf+i)>='А' && *(bf+i)<='Я'))
\
Я бы на месте компилятора вообще бы развернулся и ушел от такого программиста.
Почему бы не написать
C
1
2
#include <stype.h> 
if(isalpha(*(bf + i)))
0
blackpantera
1 / 1 / 1
Регистрация: 06.06.2012
Сообщений: 38
28.09.2012, 19:37  [ТС] 7
Мне нужно сделать без использование библиотек. Требование учителя.
0
vorob
6 / 6 / 5
Регистрация: 07.01.2012
Сообщений: 18
28.09.2012, 21:58 8
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>
 
#define MaxLength 1000
#define MaxString 1000
 
void GetLine(void);
void GetSubstring(char *bf);
 
int main(void){
    int i;
    for(i=0; i<MaxString; i++)
        GetLine();
    system("PAUSE");
    return 0;
}
 
void GetLine(void){
    char *buffer;
    buffer = (char*)calloc(MaxLength, 1);
    char format[10];
    sprintf(format, "%%%ds", MaxLength);
    scanf(format, buffer);
    printf("BUFFER: %s\r\n", buffer);
    GetSubstring(buffer);
    delete(buffer);
}
 
void GetSubstring(char *bf){
    unsigned int counter=0;
    int IsSubString=0;
    unsigned int i;
    unsigned int length = (unsigned int)strlen(bf);
    char *substring = (char*)calloc(length+1, 1);
    char *bufindexlink = bf;
    char *ssindexlink = substring;
    for(i=0; i<length; i++, bufindexlink++){
        if((*bufindexlink >= 0xffffff80 && *bufindexlink <= 0xffffff9f) || (*bufindexlink >= 0xffffffa0 && *bufindexlink <= 0xffffffef)){
            *ssindexlink=*bufindexlink;
            ssindexlink++;
            counter++;
            IsSubString=1;
            printf("  There are substrings %d/%d\r\n", counter, length);
        }else if(IsSubString == 0){
            printf("  No substrings %d/%d\r\n", counter, length);
        }
        
    }
    if(IsSubString==0)*ssindexlink='\0';
        printf("substring %s\r\n", substring);
    delete(substring);
}
Ну, я бы сделал как-то так.. )
1
blackpantera
1 / 1 / 1
Регистрация: 06.06.2012
Сообщений: 38
28.09.2012, 22:03  [ТС] 9
Спасибо). Но почему с символами не работает,обязательно записывать реальные значения?
0
vorob
6 / 6 / 5
Регистрация: 07.01.2012
Сообщений: 18
28.09.2012, 22:17 10
Это связано с кодировкой консоли винды... точней не скажу, не хочу врать.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
 
int main(void){
    setlocale(LC_ALL, "RUS");
    char a='Я';
    printf("Введите символ \"Я\": ", a);
    char b=getchar();
    printf("\r\nНаше: %c   0x%X\r\n", a, a);
    printf("Ваше: %c   0x%X\r\n", b, b);
    system("PAUSE");
return 0;
}
0
blackpantera
1 / 1 / 1
Регистрация: 06.06.2012
Сообщений: 38
29.09.2012, 17:48  [ТС] 11
Нужно сделать эту программу только без buffer, а просто создавать указатели на подстроку и учитывать, что подстрока в одной строке может быть не одна. Т.е сделать массив указателей. Только как потом выводить.Вот я попробовала не получается:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int GetSubstring(void)
{int i,j=0,counter=0,counters[100],AmountOfStrings=0,ThereAreSubstring=FALSE;
 char c, *first,*signs[100];
 
 
 
    for(i=0;((i<MaxLength)&&(((c=getchar())!=EOF) && (c!='\n')));i++)
        if (((c>=0xffffff80) && (c<=0xffffff9f) )||( (c>=0xffffffa0) && (c<=0xffffffef)))
            {
            counter++;
            if (counter<2) {first=&c;signs[j]=first;printf("First %c\n",*first);}
            counters[j]=counter;
            ThereAreSubstring=TRUE;
            printf("Counter %d %c %d %c\n",counter,*(signs[j]),counters[j]),*first;}
        else {counter=0; 
        if (ThereAreSubstring==TRUE) {j++;ThereAreSubstring=FALSE;}
        printf("Amount of strings %d \n",j);}
    
    /*AmountOfStrings=j; printf("Counter %d %x %d %d\n",counter,*signs[j-1],counters[j-1],j);
    j=0;
 
    while (j<AmountOfStrings)
        for (i=0;i<counters[j];i++,j++)
            printf("Substring %c",*(signs[j]+i));*/
            
    return FALSE;
}
0
vorob
6 / 6 / 5
Регистрация: 07.01.2012
Сообщений: 18
29.09.2012, 18:44 12
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Если я правильно понял, может быть так?)

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
void GetSubstring(void){
    struct arrayi{char *str;} *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;
    while(1){
        if((((c=getchar())!=EOF) && (c!='\n')) && bufi<MaxLength){
            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);
                }
                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);
                    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);
                bufi=0;
            }
            delete(buf);
            break;
        }
    }
    
    printf("size: %d\r\n", arraysize);
    
    for(arri=0; arri<arraysize; arri++){
        printf("substr #%d: %s\r\n", arri, arr[arri].str);
    }
    
    for(arri=0; arri<arraysize; arri++){
        delete(arr[arri].str);
    }
    delete(arr);
}
1
blackpantera
1 / 1 / 1
Регистрация: 06.06.2012
Сообщений: 38
29.09.2012, 21:27  [ТС] 13
Спасибо, а можно полностью программу. Пока разбираюсь=)
0
alkagolik
Заблокирован
29.09.2012, 22:06 14
blackpantera, надо использовать не char, а wchar_t для многобайтовых кодировок.
0
vorob
6 / 6 / 5
Регистрация: 07.01.2012
Сообщений: 18
30.09.2012, 00:21 15
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от alkagolik Посмотреть сообщение
blackpantera, надо использовать не char, а wchar_t для многобайтовых кодировок.
С каких пор Windows-1251 и CP866 это многнобайтовые кодировки?

blackpantera,
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#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);
}
0
alkagolik
Заблокирован
30.09.2012, 00:28 16
Цитата Сообщение от vorob Посмотреть сообщение
С каких пор Windows-1251 и CP866 это многнобайтовые кодировки?
с каких это пор *выше* единственные кодировки?. С каких это пор кириллица есть обязательная "часть" ascii?
0
vorob
6 / 6 / 5
Регистрация: 07.01.2012
Сообщений: 18
30.09.2012, 00:40 17
alkagolik, Не хочу спорить, просто оставлю это здесь.
Кликните здесь для просмотра всего текста
0
alkagolik
Заблокирован
30.09.2012, 01:03 18
Цитата Сообщение от vorob Посмотреть сообщение
Не хочу спорить, просто оставлю это здесь.
оставляйте. все равно это неимеет к языку Си никакого отношения.
Автор, для решения задачи используйте кодировки, "предоставляемые типом" wchar_t. То что выше просто не компилируется.
0
blackpantera
1 / 1 / 1
Регистрация: 06.06.2012
Сообщений: 38
30.09.2012, 01:12  [ТС] 19
C
1
 while(1)
Не поняла, что это значит . Один раз прокручивать или пока истина, только истина чего. Подскажите пожалуйста в чём в моей программе была проблема? У меня там проблема была с сохранением адреса первого элемента подстроки.
0
vorob
6 / 6 / 5
Регистрация: 07.01.2012
Сообщений: 18
30.09.2012, 01:13 20
Цитата Сообщение от alkagolik Посмотреть сообщение
То что выше просто не компилируется.
Виноват, вместо delete следует использовать free... перепутал, бывает)
Не правильно работает функция GetSubstring для русского текста
0
30.09.2012, 01:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2012, 01:13

Не правильно работает функция SUM для ADOQuery
Подсчитываю сумму одинаковых таможнь, а в таблицу выводит только таможни, но по...

Не работает ввод русского текста в Microsoft Visual C++ 2010 express
Здравствуйте! Не работает ввод русского текста в Microsoft Visual C++ 2010...

Функция для транслита русского языка
Здравствуйте форумчане. Имеется два TextBox-а в 1м написана фраза на русском...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru