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

Правильно ли я понимаю работу этого кода? - C++

Восстановить пароль Регистрация
 
koder
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 28
24.06.2012, 19:15     Правильно ли я понимаю работу этого кода? #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
#include <iostream>
#include <cctype>
using namespace std;
 
int main ()
{   
    char str1[80] = "Enter first string";
    char str2[80] = "Enter second string";
    char *p1, *p2;
 
    cout << "Enter first string: ";
    cin >> str1;
 
    cout << "Enter second string: ";
    cin >> str2;
 
    p1 = str1;
    p2 = str2;
 
while(*p1 && *p2) {
        if(tolower(*p1) != tolower(*p2)) break;
        else {
            p1++;
            p2++;
        }
    }
 
    if(!*p1 && !*p2)
        cout << "Strings are the same except for "
             << "possible case differences.\n";
    else
        cout << "Strings differ\n";
 
    system("pause");
    return 0;
}
Для меня важно понимать каждую мелочь, по этому опишу полностью :

Подключается заголовок iostream, который ответственный за функционирование ввода/вывода в C++.
Подключается заголовок cctype, который обеспечивает работоспособность функции tolower.
Используется пространство имен std(обеспечивающие поддержку стандартных функций).

Вызов функции запускающей программу.
Объявляется строковой массив символьного типа с размерностью 80 и именем переменной str.
Объявляется строковой массив символьного типа с размерностью 80 и именем переменной str2.
Объявляются указатели символьного типа с именами переменных *p1 и *p2.

Выводится строковой литерал с помощью оператора вывода << и ключевого слова cout(ответственного за вывод данных в консоль).
Считываются введенные данные с клавиатуры и заносятся в переменную str1 c помощью оператора вывода >> и ключевого слова cin(ответственного за считывание введенных данных с клавиатуры).

Выводится строковой литерал с помощью оператора вывода << и ключевого слова cout(ответственного за вывод данных в консоль).
Считываются введенные данные с клавиатуры и заносятся в переменную str1 c помощью оператора вывода >> и ключевого слова cin.

Переменной p1 присваивается значение строкового массива str1.(не очень понимаю почему это считается обычной переменной,если объявлялось как переменная указатель)

Переменной p1 присваивается значение строкового массива str2.

Открывается while цикл с условием в заголовке,если указатель *p1 на переменную p1 и указатель *p2 на переменную p2, возвращают ненулевое значение,а точнее если в элементе под индексом 0 строкового массива str и строкового массива str2 есть какое либо значение, то выполнить блок кода цикла.

Если значение указателя *p1 перевести в строчные символы и оно не будет равно переведенным в строчные символы значения указателя *p2 , то выполнить инструкцию выхода из цикла.
Иначе инкрементировать переменную p1 и переменную p2, а точнее в их значении увеличить индекс массива на 1 (не совсем понимаю как str[0] за счет инкремента увеличивается в str[1],то есть str[0] + str[0] будет str[1], но почему индексы слаживаются при слаживании, если в p1 находится строковой массив и по сути должно слаживаться его значение,а не он сам и индекс елемента, ведь если вывести p1,то выводится все значение массива,а если смотреть со стороны инкремента, то в p1 находится не значение массива, а str[0]).

Если значение указателя на переменную p1 и переменную p2 не ноль,то вывести строковой литерал
Иначе вывести строковой литерал.(не понимаю как именно звучит и работает оператор ! в этом контексте и видимо я неправильно это описал).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2012, 19:15     Правильно ли я понимаю работу этого кода?
Посмотрите здесь:

Правильно ли я понимаю ссылки и указатели. Работу с ними. Я сам прокомментировал код. Скажите правильно или нет. C++
C++ Есть некоторые строчки кода, которые я не понимаю
C++ Немного не понимаю как правильно сделать наследование
C++ не понимаю принцип работы кода
C++ Не понимаю логику обработки кода, разбитого на файлы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
24.06.2012, 19:45     Правильно ли я понимаю работу этого кода? #2
Цитата Сообщение от koder Посмотреть сообщение
Переменной p1 присваивается значение строкового массива str1
Имя массива можно использовать как указатель
Цитата Сообщение от koder Посмотреть сообщение
Открывается while цикл с условием в заголовке,если указатель *p1 на переменную p1 и указатель *p2 на переменную p2, возвращают ненулевое значение
в коде у тебя символы,на которые указывают каждый из указателей приводят к нижнему регистру и сравниваются друг с другом,если равны,то идём дальше,нет- не судьба и выходим из цикла
Цитата Сообщение от koder Посмотреть сообщение
не совсем понимаю как str[0] за счет инкремента увеличивается в str[1],то есть str[0] + str[0] будет str[1],
инкремент указателя-это переход на следующий элемент массива

Добавлено через 1 минуту
Цитата Сообщение от koder Посмотреть сообщение
if(!*p1 && !*p2)
все строки,записанные в массив char оканчиваются \0,поэтому проверяют значение,на которое указывает указатель,если конец какой-то строки,то прекращаем вывод строк
koder
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 28
24.06.2012, 22:47  [ТС]     Правильно ли я понимаю работу этого кода? #3
Цитата Сообщение от alexey31415 Посмотреть сообщение
все строки,записанные в массив char оканчиваются \0,поэтому проверяют значение,на которое указывает указатель,если конец какой-то строки,то прекращаем вывод строк
Я понимаю, что если в цикле все проходы будут равны, то в этой инструкции if(!*p1 && !*p2) у указателей *p1 и *p2 будет значение 0, то есть лож и функция не выполнится, для этого и стоит оператор ! (не). В итоге правильно ли я понимаю, что если в указатели попадают нулевые значение, то из за оператора ! они становятся ненулевыми и следовательно выражение истина, а если попадают ненулевые значения, то этот оператор делает из них нулевые?
xADMIRALx
 Аватар для xADMIRALx
66 / 60 / 1
Регистрация: 09.06.2012
Сообщений: 291
24.06.2012, 23:07     Правильно ли я понимаю работу этого кода? #4
Оператор ! он логический обозначает не
допустим
C++
1
2
3
4
5
bool s = false;
while(!s)/*выполнять пока(s не равна true) */
{
cout << "Вечный цикл = on;"
}
если сделаем так :

C++
1
2
3
4
5
char cs[] = "Siski";/*как думаешь сколько он будит в длинну?не правельно! :) 5 потому что в конце строки всегда '\0' */
for (int i = 0; cs[i]; ++i) /*здесь в условие мы указали если cs[i] возратит false то цикл осанавливаем. */
cout << "сколько букв : " << i << endl
 /*Тут у нас покежт 4 буквы  */
/*а теперь если попробуем в cs[4] сделать,то компилятор выдаст ошибку что длинна масива мала..*/
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
24.06.2012, 23:13     Правильно ли я понимаю работу этого кода? #5
Цитата Сообщение от xADMIRALx Посмотреть сообщение
char cs[] = "Siski";/*как думаешь сколько он будит в длинну?не правельно! 5 потому что в конце строки всегда '\0' */
Может все-таки 6?

Цитата Сообщение от xADMIRALx Посмотреть сообщение
/*а теперь если попробуем в cs[4] сделать,то компилятор выдаст ошибку что длинна масива мала..*/
Да ладно
C++
1
2
3
4
5
6
int main()
{
    char str[] = "asd";
    str[9] = 'a';
    return 0;
}
Bash
1
2
3
4
5
6
g++ -c -Wall -O3 --std=gnu++11 test.cpp -o test.o
test.cpp: In function ‘int main()’:
test.cpp:3:10: warning: variable ‘str’ set but not used [-Wunused-but-set-variable]
g++ foo.o test.o -lm -o test
 
Press ENTER or type command to continue
xADMIRALx
 Аватар для xADMIRALx
66 / 60 / 1
Регистрация: 09.06.2012
Сообщений: 291
24.06.2012, 23:23     Правильно ли я понимаю работу этого кода? #6
soon
Проверьте

pff точна 6
хм странно
если попробывать это в цикле то
C++
1
2
3
char str[] = "siski";
for (int i = 0; str[i] ; ++i)
cout << "i = " << i << endl
i = 4 то есть + 1 должно получиться 5...мхмхм,или я туплю или что то не туо
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
24.06.2012, 23:28     Правильно ли я понимаю работу этого кода? #7
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
int main()
{
    char cs[] = "Siski";
    for (int i = 0; cs[i]; ++i)
        std::cout << "сколько букв : " << i << std::endl;
    std::cout << sizeof(cs) << std::endl;
    return 0;
}
С вас две минуты моего времени.

Добавлено через 49 секунд
Если вы до сих пор не видите, что в вашей строке 5 букв + \0, что в итоге дает 6 - это, наверное, уже не лечится.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
24.06.2012, 23:33     Правильно ли я понимаю работу этого кода? #8
Цитата Сообщение от soon Посмотреть сообщение
char str[] = "asd";
str[9] = 'a';
не, ну компилятор то не даст ошибки
а вот во время исполнения скорее всего исключение типа "Пишем в запрещенную память"
или что серьезней стек то испортили... куда выйдем из функции одному Биллу известно

Добавлено через 1 минуту
Цитата Сообщение от soon Посмотреть сообщение
вашей строке 5 букв + \0, что в итоге дает 6
строка равна 5 Буфер 6
о чем спор??
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
24.06.2012, 23:35     Правильно ли я понимаю работу этого кода? #9
ValeryS, xADMIRALx считать не умеет. Спора нет, я уже закончил.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
24.06.2012, 23:45     Правильно ли я понимаю работу этого кода? #10
Цитата Сообщение от xADMIRALx Посмотреть сообщение
i = 4 то есть + 1 должно получиться 5
правильно пять букв на шестой итерации(i = 5) cs[i]==0 вываливаемся из цикла
итого 5 букв размер строки. размер буфера 6
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2012, 23:55     Правильно ли я понимаю работу этого кода?
Еще ссылки по теме:

C++ Не понимаю что не правильно
День добрый! Как устроен стек при работе программ ? Правильно ли я понимаю? C++
C++ Не понимаю часть кода

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

Или воспользуйтесь поиском по форуму:
xADMIRALx
 Аватар для xADMIRALx
66 / 60 / 1
Регистрация: 09.06.2012
Сообщений: 291
24.06.2012, 23:55     Правильно ли я понимаю работу этого кода? #11
Умею считать,просчитался прост
Yandex
Объявления
24.06.2012, 23:55     Правильно ли я понимаю работу этого кода?
Ответ Создать тему
Опции темы

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