Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реверсия Не хочет работать буква "Я" 
:(
    Опции темы
Syltan
Дата 25.9.2009, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 301
Регистрация: 31.8.2009

Репутация: нет
Всего: -2



Вот, написал небольшую программку реверсирования. 
На форме находится 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()

Это сообщение отредактировал(а) Syltan - 25.9.2009, 18:31
PM MAIL   Вверх
586
Дата 25.9.2009, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Используй класс 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;
}

PM   Вверх
Syltan
Дата 25.9.2009, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 301
Регистрация: 31.8.2009

Репутация: нет
Всего: -2



Неа, не помогло, выдаёт также само, при вводе большого Я, маленький в результате не получается.
Не знаю что делать.
PM MAIL   Вверх
Anikmar
Дата 26.9.2009, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



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

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

PM MAIL ICQ   Вверх
Syltan
Дата 26.9.2009, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 301
Регистрация: 31.8.2009

Репутация: нет
Всего: -2



Понимаете, в консоли работает, вот этот код:
Код

#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();
}
 


Как сделать чтоб с объектами этот же код работал?
PM MAIL   Вверх
586
Дата 26.9.2009, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



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

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


Это сообщение отредактировал(а) 586 - 26.9.2009, 13:18
PM   Вверх
Syltan
Дата 26.9.2009, 13:24 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 301
Регистрация: 31.8.2009

Репутация: нет
Всего: -2



НЕ помогает. Ещё увидел одну проблемму.
Программа работает только один раз, при вводе 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;
}
//---------------------------------------------------------------------------




Это сообщение отредактировал(а) Syltan - 26.9.2009, 13:28
PM MAIL   Вверх
586
Дата 26.9.2009, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Ну и чего по прежнему 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;
}

PM   Вверх
Syltan
Дата 26.9.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 301
Регистрация: 31.8.2009

Репутация: нет
Всего: -2



Мне нужен unsigned char ,если написать его программа не скомпилится, а только компилится с чаром.

Это сообщение отредактировал(а) Syltan - 26.9.2009, 13:37
PM MAIL   Вверх
586
Дата 26.9.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



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

Мой код компилируется?
PM   Вверх
Syltan
Дата 26.9.2009, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 301
Регистрация: 31.8.2009

Репутация: нет
Всего: -2



,Ваш код вроде работает, осталась небольшая проблема. Нужно,чтоб когда я ввёл один раз слово, и нажимал на кнопку батон несколько раз, и эти несколько раз менялось значение в Эдит 2. Например,я ввёл слово - "Янтарь" в Эдит1, нажал на кнопку, в Эдит 2 отобразилось:
яНТАРЬ, потом, ничего не ввожу, а снова нажал на Батон1, в Эдит2, отобразилось Янтарь.
PM MAIL   Вверх
586
Дата 26.9.2009, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Удали Edit2 и выводи результат в Edit1.
PM   Вверх
Syltan
Дата 26.9.2009, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 301
Регистрация: 31.8.2009

Репутация: нет
Всего: -2



Мне нужно,чтоб именно в Эдит2 выводился,что делать?
PM MAIL   Вверх
586
Дата 26.9.2009, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Цитата(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;
}

PM   Вверх
YanTsys
Дата 26.9.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 22.3.2006

Репутация: нет
Всего: нет



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

Добавлено через 1 минуту и 2 секунды
Опссс... влез не вовремя 
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1400 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.