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

Подскажите, почему это работает!?) - C++

Восстановить пароль Регистрация
 
atmosfz
0 / 0 / 0
Регистрация: 06.06.2014
Сообщений: 4
07.06.2014, 19:33     Подскажите, почему это работает!?) #1
Мне необходимо изменить все строчные буквы на заглавные, это все получается. Я ввожу символы(причем заметьте массив чар из 0, но программа все равно работает) я что-то разобраться не могу почему, подскажите что я не знаю и не понимаю, если Вас не затруднит. По-моему мнению, она должна читать только первый символ, но программа выводит все символы строки, например: Hello world. Выводит: HELLOWORLD (и почему-то без пробела и точки). Не могу понять как работает сия программа, кою я написал. Хочу разобраться почему. Буду очень признателен, если поможете.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
   char word[0];
      for (int i=0; i<18; i++)
          {
          cin>>word[i];
          if(word[i]=='.')
          break;
           }
        char *p=word; 
         while(*p)
            {
            if (islower(*p)) *p = toupper(*p);
            p++;
            }
            cout << "String to upper : " << word << endl;
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.06.2014, 19:41     Подскажите, почему это работает!?) #2
выход за пределы массива не контролируется
atmosfz
0 / 0 / 0
Регистрация: 06.06.2014
Сообщений: 4
07.06.2014, 20:01  [ТС]     Подскажите, почему это работает!?) #3
А что происходит после выхода? Почему символы присваиваются нужные?

Добавлено через 7 минут
Да, и сразу второй вопрос, когда я делаю массив из чар равным допустим 100, на выход я ничего не получаю, почему?
kupnu4
26 / 26 / 9
Регистрация: 03.05.2013
Сообщений: 71
07.06.2014, 20:33     Подскажите, почему это работает!?) #4
работает это, вероятно, потому что указатели и массивы схожи. конкретно имя массива - указатель на первый элемент массива. обращение через квадратные скобочки - ничто иное как *(array_name+index). и потому это работает (это не значит что так делать хорошо). так как массив у вас размером 0 (скорее всего это то же самое что и просто char*), то все остальные занятые массивом ячейки памяти - незарезервированы под него и как следствие могут быть перезаписаны под другие нужды программы. Вывод при массиве символов из 100 элементов не работает так как вывод массивов работает иначе:
C++
1
2
3
for(int i=0;i<18;++i)
    std::cout << array[i];
std::cout << "\n";
вполне сработает.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.06.2014, 20:35     Подскажите, почему это работает!?) #5
Цитата Сообщение от atmosfz Посмотреть сообщение
А что происходит после выхода?
лезете в чужую память

Цитата Сообщение от atmosfz Посмотреть сообщение
Почему символы присваиваются нужные?
невезение, если бы повезло то получили бы по зубам от ОС и больше бы так не делали

Цитата Сообщение от atmosfz Посмотреть сообщение
Да, и сразу второй вопрос, когда я делаю массив из чар равным допустим 100, на выход я ничего не получаю, почему?
давайте полный код
atmosfz
0 / 0 / 0
Регистрация: 06.06.2014
Сообщений: 4
07.06.2014, 20:52  [ТС]     Подскажите, почему это работает!?) #6
Вот полный код, какой я думаю должен быть.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
int main()
{
      char word[100];
      int max,chars[256]={0};
        for (int i=0; i<100; i++)
       {
        cin>>word[i];
        if(word[i]=='.')
        break;
       }
        char *p=word; 
         while(*p)
            {
            if (islower(*p)) *p = toupper(*p);
            p++;
            }
            cout << " Заглавные буквы: " << word << endl; 
      
return 0;
}
Добавлено через 13 минут
Попробовал вывести массив, как мне подсказали в комментарии, не получается, наверное все дело в *p
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2014, 20:55     Подскажите, почему это работает!?)
Еще ссылки по теме:

Подскажите, почему не работает strcpy_s() C++
Подскажите плз, почему не работает C++
Подскажите почему не работает C++

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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.06.2014, 20:55     Подскажите, почему это работает!?) #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
atmosfz, ты не учитываешь что строка должна завершатся нулем и цикл
C++
1
while(*p)
превращается в бесконечный.
считывай строку так:
C++
1
cin >> word;
или
C++
1
cin.getline(word, 100);
Yandex
Объявления
07.06.2014, 20:55     Подскажите, почему это работает!?)
Ответ Создать тему
Опции темы

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