Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2013, 14:48   #1
choc
 
Регистрация: 07.05.2013
Сообщений: 9
По умолчанию строки-массивы символов

задание: изменить все маленькие буквы на большие.

Код:
#include<iostream>
	#include<string>
	#include <cstring>
	using namespace std;

	int main()
	{ 
		char* s=new char [100];
		cin>>s;
		int count = strlen(s);
		for(int i=0;i<count;i++)
		{
			if (96<s[i]<123 && 159<s[i]<176)
				s[i]=s[i]-32;
			if (223<s[i]<240)
				s[i]=s[i]-68;
		}
		cout<<s<<endl;
		delete [] s;
		system("pause");

		return 0;
	}

работает только s[i]=s[i]-32; помогите найти ошибку.
choc вне форума Ответить с цитированием
Старый 08.05.2013, 17:04   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Не слышал про двойные неравенства (не поддерживаются они, по идее):
Код:
if ((96<s[i] && s[i]<123) || (159<s[i] && s[i]<176))
    s[i]-=32;
else if (223<s[i] && s[i]<240)
    s[i]-=68;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 08.05.2013, 19:16   #3
choc
 
Регистрация: 07.05.2013
Сообщений: 9
По умолчанию

так тоже работает только s[i]-=32.

какую кодировку имеют русские буквы?

Последний раз редактировалось choc; 08.05.2013 в 19:32.
choc вне форума Ответить с цитированием
Старый 08.05.2013, 21:33   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
#include <iostream>
#include <string>
#include <cstring>

using namespace std;

int
main()
{
    char *s = new char[100];
    cin >> s;
    for (int i = 0; i < strlen(s); ++i) {
        unsigned char c = s[i];
        if ((96 < c && c < 123) || (159 < c && c < 176))
            s[i] -= 32;
        else if (223 < c && c < 240)
            s[i] -= 80;
    }
    cout << s << endl;
    delete []s;
    system("pause");
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 09.05.2013, 17:20   #5
choc
 
Регистрация: 07.05.2013
Сообщений: 9
По умолчанию

почему преобразовывает только до пробела? как это исправить?
Код:
#include<iostream>
	using namespace std;

	void let (char* s)
	{
		int count= strlen(s);
		for (int i = 0; i < count; i++) 
		 { 
			 unsigned char c = s[i];
			 if ((96 < c && c < 123) || (159 < c && c < 176))
				 s[i] -= 32;
			 else if (223 < c && c < 240) 
				 s[i] -= 80; 
			 else if (c=32)  // else
				 s[i]=32;
			 
		 }
	}

	int main()
	{
		char* s=new char [100];
		cin>>s;
		char * gl_s=s;
		let (gl_s);
		cout<<s<<endl;
		delete [] s;
		system("pause"); 
		return 0;
	}

Последний раз редактировалось choc; 09.05.2013 в 17:22.
choc вне форума Ответить с цитированием
Старый 09.05.2013, 17:41   #6
choc
 
Регистрация: 07.05.2013
Сообщений: 9
По умолчанию

cin>>s;
заменить на
gets(s);
choc вне форума Ответить с цитированием
Старый 09.05.2013, 17:53   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
почему преобразовывает только до пробела?
Да, именно gets.
А зачем Вам ветка else на пробел?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 09.05.2013, 18:08   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
96 < c && c < 123
А почему не 'а'< c && c < 'я'
?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.05.2013, 18:12   #9
RussDragon
Форумчанин
 
Аватар для RussDragon
 
Регистрация: 07.04.2012
Сообщений: 216
По умолчанию

А почему отказались от http://www.cplusplus.com/reference/cctype/toupper/ ?
RussDragon вне форума Ответить с цитированием
Старый 09.05.2013, 18:29   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А почему не 'а'< c && c < 'я'
?
Исходный код будет сохранен, скорее всего, в cp1251 (коды не совпадут).
Цитата:
Сообщение от RussDragon Посмотреть сообщение
А почему отказались от http://www.cplusplus.com/reference/cctype/toupper/ ?
Во-первых, может быть задание реализовать самому эту функциональность.
Во-вторых, у меня лично не получилось с помощью нее перевести в верхний регистр:
Код:
#include <iostream>
#include <cstring>
#include <locale>
#include <cstdio>

using namespace std;

int
main()
{
    locale loc;
    char *s = new char[100];
    gets(s);
    for (int i = 0; i < strlen(s); ++i) {
        s[i] = toupper(s[i], loc);
    }
    cout << s << endl;
    delete []s;
    system("pause");
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на строки. Даны две строки. Определить можно ли из символов первой строки получить вторую строку.( написать подпрограммой и ANTON1994 Паскаль, Turbo Pascal, PascalABC.NET 5 09.02.2013 14:07
Двумерные массивы(матрица) 2)Строковые массивы(строки): 3)Структуры nuriyat Помощь студентам 1 21.01.2012 16:16
Массивы сравнение символов jasul Общие вопросы C/C++ 3 27.10.2011 18:14
Массивы символов с++ chagin_yav Помощь студентам 2 04.01.2008 19:14
Массивы символов (строки) символьные файлы. anarchist Помощь студентам 2 24.12.2007 09:16