Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
IvanInanovich
0 / 0 / 2
Регистрация: 03.01.2013
Сообщений: 113
#1

Символы из нижнего регистра перевести в верхний - C++

27.04.2013, 02:41. Просмотров 1073. Ответов 9
Метки нет (Все метки)

Приветствую. Нужно символы из нижнего регистра перевести в верхний.
Вот сама программа (которую можно не смотреть):


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
#include <iostream>
#include <cstring>
#include <ctype.h>      
using namespace std;
////////////////////////////////////////////////////////////////
class String             
   {
   private:
      char* str;                   
   public:
      String(char* s)               
         {
         int length = strlen(s);   
         str = new char[length+1];  
         strcpy(str, s);            
         }
      ~String()                     
         {
         cout << "Deleting str\n";
         delete[] str;             
         }
      void display()                
         {
         cout << str << endl;
         }
         void upnit()
         {
            char temp ;
             while(*str)
             {
                    temp = toupper(*str);
                    *str++ = temp;
            }
         }
   };
////////////////////////////////////////////////////////////////
int main()
   {                                
   String s1 = "Who knows nothing doubts nothing.";
 
   cout << "s1=";                  
    s1.display();
   s1.upnit();
   s1.display();
   return 0;
   }
А вот метод который отвечает за перевод в верхний регистр:
C++
1
2
3
4
5
6
7
8
9
void upnit()
         {
            char temp ;
             while(*str)
             {
                    temp = toupper(*str);
                    *str++ = temp;
            }
         }
Подскажите, что делаю не так? Если вставить cout << temp; то можно заметить что символы преобразовываются, но не присваиваются строке.
http://www.cyberforum.ru/cpp-beginners/thread921048.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2013, 02:41
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Символы из нижнего регистра перевести в верхний (C++):

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

Написать функцию которая в строке заменяет все символы верхнего регистра в символы нижнего регистра
Здравствуйте. помогите написать программу. Написать функцию которая в строке...

Буква из нижнего регистра в верхний
добрый день, цель задачи: Преобразование букв нижнего регистра в верхний...

Замена нижнего регистра литер русского языка, вводимых с клавиатуры, на верхний регистр
Для программы необходимо реализовать замену нижнего регистра литер русского...

Обработать вектор, отобразив элементы по восемь слов на строку, перевести символы элементов в верхний регистр
Здравствуйте. Такая задача: Прочитайте последовательность слов из потока cin...

9
stima
495 / 345 / 93
Регистрация: 22.03.2011
Сообщений: 1,107
Завершенные тесты: 2
27.04.2013, 02:56 #2
Вы забыли нультерминировать строку.
C++
1
2
3
4
5
6
int length = strlen(s);   
str = new char[length+1];
str[length] = 0;
//или str = new char[length+1](); 
 
strcpy(str, s);
1
IvanInanovich
0 / 0 / 2
Регистрация: 03.01.2013
Сообщений: 113
27.04.2013, 03:10  [ТС] #3
Цитата Сообщение от stima Посмотреть сообщение
Вы забыли нультерминировать строку.
C++
1
2
3
4
5
6
int length = strlen(s);   
str = new char[length+1];
str[length] = 0;
//или str = new char[length+1](); 
 
strcpy(str, s);
Благодарю. Это делается для того, что бы обнулить указатель? т.е. скинуть до нуля значение указателя?
Правда программа все ровно не работает.
0
Юрий Владимиров
52 / 52 / 5
Регистрация: 06.04.2013
Сообщений: 178
27.04.2013, 03:16 #4
Цитата Сообщение от IvanInanovich Посмотреть сообщение
Это делается для того, что бы обнулить указатель? т.е. скинуть до нуля значение указателя?
нульевой символ - это граница строки, т е строка s[0]...и до тех пор, пока не встретится "0"
короче сигнализирует про конец строки

в паскале наоборот, в s[0] хранится длинна строки, а в C -- на каком месте (позиции) стоит "0" -- это признак завершения
1
stima
495 / 345 / 93
Регистрация: 22.03.2011
Сообщений: 1,107
Завершенные тесты: 2
27.04.2013, 04:22 #5
Во первых подумайте что Вы инкрементируете, во вторых Вы так уверены в порядке операндов? Мне лично тяжело было сразу вспомнить что за чем идет.

C++
1
*str++ = temp;
0
IvanInanovich
0 / 0 / 2
Регистрация: 03.01.2013
Сообщений: 113
27.04.2013, 15:46  [ТС] #6
Цитата Сообщение от Юрий Владимиров Посмотреть сообщение
нульевой символ - это граница строки, т е строка s[0]...и до тех пор, пока не встретится "0"
короче сигнализирует про конец строки

в паскале наоборот, в s[0] хранится длинна строки, а в C -- на каком месте (позиции) стоит "0" -- это признак завершения
Благодарю. Ночью было подумал что это значение указателя на первый символ таким образом нужно скинуть. В таком случае надо не str[length] = 0; , а str[length+1] = 0; В первом варианте мы урежим строку на 1 символ.


Насколько я знаю, в данном ситуации строка сама добавляет нулевой символ. Если бы это было не так, то цикл while(*str) был бы вечный. Но он нужное количество циклов делает. Этот пример кода из книги. Мой лишь метод преобразования.

Цитата Сообщение от stima Посмотреть сообщение
Во первых подумайте что Вы инкрементируете, во вторых Вы так уверены в порядке операндов? Мне лично тяжело было сразу вспомнить что за чем идет.

C++
1
*str++ = temp;
Делаю на примере из книги. Увеличиваю значение самого указателя. Т.е. в данном случае перепрыгиваю на следующий байт и присваиваю ему символ верхнего регистра.
0
stima
495 / 345 / 93
Регистрация: 22.03.2011
Сообщений: 1,107
Завершенные тесты: 2
27.04.2013, 15:58 #7
Цитата Сообщение от IvanInanovich Посмотреть сообщение
а str[length+1] = 0; В первом варианте мы урежим строку на 1 символ.
Нет. Вы же написали new char[length + 1]. Вот в этот 1 и запишется нультерминант. И собственно поэтому там и пишется + 1.


Цитата Сообщение от IvanInanovich Посмотреть сообщение
Насколько я знаю, в данном ситуации строка сама добавляет нулевой символ.
Магии тут нет. Есть закулисье. Просто strcpy скопирует с учетом нультерминанта и по этому вы и не вхдоите в бесконечный цикл. Но так не правильно.

Цитата Сообщение от IvanInanovich Посмотреть сообщение
Делаю на примере из книги. Увеличиваю значение самого указателя. Т.е. в данном случае перепрыгиваю на следующий байт и присваиваю ему символ верхнего регистра.
Подумайте над инкрементом подольше).
1
IvanInanovich
0 / 0 / 2
Регистрация: 03.01.2013
Сообщений: 113
27.04.2013, 19:01  [ТС] #8
stima, Не прав был. Извиняюсь.
По поводу инкремента. В книге есть схожий пример, только там обмен строки с помощью 2х указателей. Почему не срабатывает в данной случае - не понимаю. Пробовал так:
C++
1
2
3
4
5
6
7
8
9
10
11
void upnit()
         {
            char temp ;
            int n = 0;
             while(*str)
             {
                    temp = toupper(*(str+n));
                    *(str+n++) = temp;
 
 
            }
В таком случае программа завершается аварийно. Как дошел до указателей, так и начались проблемы у меня)

Добавлено через 9 минут
В книге решилась так задача:
C++
1
2
3
4
5
6
7
8
9
void String::upit()                 
   {
   char* ptrch = str;             
   while( *ptrch )                  
      {
      *ptrch = toupper(*ptrch);     
      ptrch++;                     
      }
   }
0
stima
495 / 345 / 93
Регистрация: 22.03.2011
Сообщений: 1,107
Завершенные тесты: 2
27.04.2013, 20:53 #9
Вы не думали)).

Цитата Сообщение от IvanInanovich Посмотреть сообщение
char* ptrch = str;
Обратите внимание на это они икрементируют временную переменную. Вы же инкрементируете переменную класса. В итоге после одного прохода она у указатель Ваc будет смещен на длину строки.

Если вы не знали то инкремент увеличивает переменную на один.
C++
1
2
3
4
5
6
7
int i =  0;
std::cout << i << std::endl; //0
i++;
std::cout << i << std::endl; //1
++i;
std::cout << i << std::endl; //2
и т.д.
1
IvanInanovich
0 / 0 / 2
Регистрация: 03.01.2013
Сообщений: 113
27.04.2013, 21:50  [ТС] #10
До меня дошло. ))Спасибо большое!
0
27.04.2013, 21:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2013, 21:50
Привет! Вот еще темы с решениями:

В новом файле заменить все латинские буквы верхнего регистра на буквы нижнего регистра
9. В новом файле заменить все латинские буквы верхнего регистра на буквы...

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

Функция преобразует буквы верхнего регистра в строке s в буквы нижнего регистра
Задание: strlwr char *strlwr( char *s); Функция преобразует буквы верхнего...

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


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

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

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