Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
27.04.2013, 02:41     Символы из нижнего регистра перевести в верхний #1
Приветствую. Нужно символы из нижнего регистра перевести в верхний.
Вот сама программа (которую можно не смотреть):


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; то можно заметить что символы преобразовываются, но не присваиваются строке.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2013, 02:41     Символы из нижнего регистра перевести в верхний
Посмотрите здесь:

написать функцию, которая в строке заменяет все символы верхенго регистра в символы нижнего регистра C++
C++ Написать функцию которая в строке заменяет все символы верхнего регистра в символы нижнего регистра
C++ как перевести букву из нижнего регистра в верхний C++
C++ Буква из нижнего регистра в верхний
C++ Функция преобразует буквы верхнего регистра в строке s в буквы нижнего регистра
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
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);
IvanInanovich
0 / 0 / 0
Регистрация: 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);
Благодарю. Это делается для того, что бы обнулить указатель? т.е. скинуть до нуля значение указателя?
Правда программа все ровно не работает.
Юрий Владимиров
 Аватар для Юрий Владимиров
51 / 51 / 2
Регистрация: 06.04.2013
Сообщений: 178
27.04.2013, 03:16     Символы из нижнего регистра перевести в верхний #4
Цитата Сообщение от IvanInanovich Посмотреть сообщение
Это делается для того, что бы обнулить указатель? т.е. скинуть до нуля значение указателя?
нульевой символ - это граница строки, т е строка s[0]...и до тех пор, пока не встретится "0"
короче сигнализирует про конец строки

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

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


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

Цитата Сообщение от IvanInanovich Посмотреть сообщение
Делаю на примере из книги. Увеличиваю значение самого указателя. Т.е. в данном случае перепрыгиваю на следующий байт и присваиваю ему символ верхнего регистра.
Подумайте над инкрементом подольше).
IvanInanovich
0 / 0 / 0
Регистрация: 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++;                     
      }
   }
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
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
и т.д.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2013, 21:50     Символы из нижнего регистра перевести в верхний
Еще ссылки по теме:

Переписать в новый фаил строки, удалив из них все латинские буквы нижнего регистра C++
Движение по шахматной доске коня (с левого нижнего угла в верхний правый угол) C++
Замена нижнего регистра литер русского языка, вводимых с клавиатуры, на верхний регистр C++

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

Или воспользуйтесь поиском по форуму:
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
27.04.2013, 21:50  [ТС]     Символы из нижнего регистра перевести в верхний #10
До меня дошло. ))Спасибо большое!
Yandex
Объявления
27.04.2013, 21:50     Символы из нижнего регистра перевести в верхний
Ответ Создать тему
Опции темы

Текущее время: 09:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru