Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Реверсия Не хочет работать буква "Я"


Автор: Syltan 25.9.2009, 18:28
Вот, написал небольшую программку реверсирования. 
На форме находится Edit1,Edit2,Button1. В Эдит1 я ввожу русские символы.
Если я ввёл букву с большой буквы, тогда при нажатии на батон1, в поле Эдит2,должна появится маленькая буква,
если в Эдит1 ввёл маленькую букву, при нажатии на кнопку, в поле Эдит2, должна появится Большая буква.

В обработчик события Button1, вставляю такой код:

Код

char *p;
int i;
  p = Edit1->Text.c_str();
  for(i = 0; p[i]; i++)
  {
    if(isupper(p[i]))
      p[i] = tolower(p[i]);
    else
      if(islower(p[i]))
        p[i] = toupper(p[i]);
  }
  Edit2->Text=p;

Вроде так как я хотел, но дело в том,что программа компилится, но при вводе "Я", в маленькую "я", не преобразует. Может подскажите,преобразователь в unsigned char? Вот консольный вариант, он работает, я хочу с объектами,чтоб был точно такой:
Код


#include <iostream>
#include <ctype.h>
using namespace std;
 
int main()
{
setlocale(0,"");
unsigned char *p;
int i;
unsigned char str[80] = "Собака";
p = str;
for(i = 0; p[i]; i++) {
if(isupper(p[i]))
p[i] = tolower(p[i]);
else
if(islower(p[i]))
p[i] = toupper(p[i]);
}
 
 
cout<<"Результат\n"<<str;
cin.get();
}
 


Подскажите пожалуйста, существует ли преобразователь в unsigned char он мне нужен для первого кода на форме,тоесть вместо этого c_str()

Автор: 586 25.9.2009, 22:17
Используй класс String вместо char*.
Код
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    setlocale(LC_ALL, "");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  String s = Edit1->Text;
  // класс String индексируется с единицы, а не с нуля
  for(int i = 1; i <= s.Length(); ++i)
  {
    if(isupper((unsigned char)s[i]))
      s[i] = tolower((unsigned char)s[i]);
    else
      if(islower((unsigned char)s[i]))
        s[i] = toupper((unsigned char)s[i]);
  }
  Edit2->Text = s;
}

Автор: Syltan 25.9.2009, 23:30
Неа, не помогло, выдаёт также само, при вводе большого Я, маленький в результате не получается.
Не знаю что делать.

Автор: Anikmar 26.9.2009, 09:59
Цитата(Syltan @  25.9.2009,  23:30 Найти цитируемый пост)
Не знаю что делать. 

Если так нужно - напишите свою функцию toupper/tolower

Автор: Syltan 26.9.2009, 12:49
Понимаете, в консоли работает, вот этот код:
Код

#include <iostream>
#include <ctype.h>
using namespace std;
 
int main()
{
setlocale(0,"");
unsigned char *p;
int i;
unsigned char str[80] = "Собака";
p = str;
for(i = 0; p[i]; i++) {
if(isupper(p[i]))
p[i] = tolower(p[i]);
else
if(islower(p[i]))
p[i] = toupper(p[i]);
}
 
 
cout<<"Результат\n"<<str;
cin.get();
}
 


Как сделать чтоб с объектами этот же код работал?

Автор: 586 26.9.2009, 13:18
Цитата(Syltan @  26.9.2009,  00:30 Найти цитируемый пост)
Неа, не помогло, выдаёт также само, при вводе большого Я, маленький в результате не получается.
Не знаю что делать. 

А при вводе других русских букв, работает?
А если так написать:
Код
setlocale(LC_ALL, "Russian");

Автор: Syltan 26.9.2009, 13:24
НЕ помогает. Ещё увидел одну проблемму.
Программа работает только один раз, при вводе 2-ой раз в Эдит, слова, и нажатии кнопки батон, программа просто выводит всё то,что я ввёл в Эдит1, то и выводит в Эдит2 без изменения. По поводу буквы"Я",чтоб заработало,нужно чтоб был unsigned char,как его сюда применить?

Вот код:
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
setlocale(LC_ALL,"Russian");
char *p;
int i;
  p = Edit1->Text.c_str();
  for(i = 0; p[i]; i++)
  {
    if(isupper(p[i]))
      p[i] = tolower(p[i]);
    else
      if(islower(p[i]))
        p[i] = toupper(p[i]);
  }
  Edit2->Text=p;
}
//---------------------------------------------------------------------------



Автор: 586 26.9.2009, 13:32
Ну и чего по прежнему char* пишешь? Или нужен именно char* ?
Код
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char buffer[80];
char *p = buffer;
int i;
  strcpy(buffer, Edit1->Text.c_str());
  for(i = 0; p[i]; i++)
  {
    if(isupper((unsigned char)p[i]))
      p[i] = tolower((unsigned char)p[i]);
    else
      if(islower((unsigned char)p[i]))
        p[i] = toupper((unsigned char)p[i]);
  }
  Edit2->Text=buffer;
}

Автор: Syltan 26.9.2009, 13:37
Мне нужен unsigned char ,если написать его программа не скомпилится, а только компилится с чаром.

Автор: 586 26.9.2009, 13:39
Цитата(Syltan @  26.9.2009,  14:37 Найти цитируемый пост)
Мне нуженunsigned char ,если написать его программа не скомпилится, а только компилится с чаром. 

Мой код компилируется?

Автор: Syltan 26.9.2009, 13:47
,Ваш код вроде работает, осталась небольшая проблема. Нужно,чтоб когда я ввёл один раз слово, и нажимал на кнопку батон несколько раз, и эти несколько раз менялось значение в Эдит 2. Например,я ввёл слово - "Янтарь" в Эдит1, нажал на кнопку, в Эдит 2 отобразилось:
яНТАРЬ, потом, ничего не ввожу, а снова нажал на Батон1, в Эдит2, отобразилось Янтарь.

Автор: 586 26.9.2009, 13:53
Удали Edit2 и выводи результат в Edit1.

Автор: Syltan 26.9.2009, 14:10
Мне нужно,чтоб именно в Эдит2 выводился,что делать?

Автор: 586 26.9.2009, 14:15
Цитата(Syltan @  26.9.2009,  15:10 Найти цитируемый пост)
Мне нужно,чтоб именно в Эдит2 выводился,что делать? 

Код
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  String s;
  if(Edit1->Modified)
  {
    s = Edit1->Text;
    Edit1->Modified = false;
  }
  else
  {
    s = Edit2->Text;
  }
  // класс String индексируется с единицы, а не с нуля
  for(int i = 1; i <= s.Length(); ++i)
  {
    if(isupper((unsigned char)s[i]))
      s[i] = tolower((unsigned char)s[i]);
    else
      if(islower((unsigned char)s[i]))
        s[i] = toupper((unsigned char)s[i]);
  }
  Edit2->Text = s;
}

Автор: YanTsys 26.9.2009, 14:17
Добавь проверку условия, если Edit2 пустой брать текст для преобразования из Edit1 иначе из Edit2

Добавлено через 1 минуту и 2 секунды
Опссс... влез не вовремя 

Автор: Syltan 26.9.2009, 14:25
Спасибо 586,самое странное,это то,что если не поставить вот эту строку:
Код


setlocale(LC_ALL,"Russian");


Ваш код не будет работать. Спасибо.
Вы можете подсказать, что означает:
Код


 Edit1->Modified = false;

Автор: 586 26.9.2009, 14:45
Цитата(Syltan @  26.9.2009,  15:25 Найти цитируемый пост)
самое странное,это то,что если не поставить вот эту строку:
Код
setlocale(LC_ALL,"Russian");

Ваш код не будет работать.

Не только мой код, но и ваш консольный вариант.

Цитата(Syltan @  26.9.2009,  15:25 Найти цитируемый пост)
Вы можете подсказать, что означает:
Код
Edit1->Modified = false;

При изменении Эдит'а, свойство Modified становится true.
Чтобы код работал правильно, свойство Modified сбрасывается.

Автор: Syltan 26.9.2009, 14:56
Прошу прощения,как понимать это условие,очень нужно понять.
Код

if(Edit1->Modified)
  {
    s = Edit1->Text;
    Edit1->Modified = false;
  }

Автор: 586 26.9.2009, 15:26
Если Edit1 изменён, то в переменную s заносится значение из Edit1 и Edit1 помечается как неизменённый.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)