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

Не работает strcmp + указатели непойми что опять выводят - C++

Восстановить пароль Регистрация
 
AnreyKazakov
Заблокирован
11.09.2012, 00:01     Не работает strcmp + указатели непойми что опять выводят #1
Странно все это в одном примере работает strcmp в другом (здесь) не работает. Не могу понять почему, пока разбирался решил проверить на какой адрес указатель показывает, а он почему-то не меняет свое значение. Очень странно....
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
#include <iostream>
#include <cstring>
int main(){
    const char* line1="Hello";
    const char* line2="World";
    std::cout<<&line1<<" "<<&line2<<std::endl;
    while(*line1!='\0'){
        std::cout<<*line1<<std::endl;
        std::cout<<&line1<<std::endl;
        ++line1;/*так как идет приращение я думал, что адрес памяти
в строчке сверху будет меняться, а он какой-то константный....*/
        }
        std::cout<<" ";
    while(*line2!='\0'){
        std::cout<<*line2;
        ++line2;
        }   
        std::cout<<std::endl;
        std::cout<<&line1<<" "<<&line2<<std::endl;
        int i=strcmp(line1,line2);/*независимо от значений массивов line1
line 2 значение i равно 0 , что вообще не вписывается в мое понимание этого мира....как так?*/
        std::cout<<i<<std::endl;
    if(strcmp(line1,line2)==0){std::cout<<"TRUE";}else{std::cout<<"FALSE";}
    std::cout<<std::endl;
    return 0;
    }
непонятно в общем чет совсем =(

Добавлено через 36 минут
Очень все это странно, когда второй while убираешь, то все ок...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <cstring>
int main(){
    const char* line1="Hello";
    const char* line2="World";
    while(*line1!='\0'){
        std::cout<<*line1;
        ++line1;
        }
        std::cout<<" ";
    /*while(*line2!='\0'){
        std::cout<<*line2;
        ++line2;
        }   */
        std::cout<<std::endl;
        int i=strcmp(line1,line2);
        std::cout<<i<<std::endl;
    if(strcmp(line1,line2)==0){std::cout<<"TRUE";}else{std::cout<<"FALSE";}
    std::cout<<std::endl;
    return 0;
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2012, 00:01     Не работает strcmp + указатели непойми что опять выводят
Посмотрите здесь:

Что опять не так в функции? C++
C++ strcmp не работает!
Что такое указатели? C++
Что делает функция strcmp(s1,s2) ? C++
Опять указатели C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.09.2012, 00:19     Не работает strcmp + указатели непойми что опять выводят #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
int main()
{
   const char* str = "hello";
   
   while (*str)
   {
      std::cout << *str << '\n';
      std::cout << static_cast<const void*>(str++) << '\n';
   }
}
http://liveworkspace.org/code/6d82a7...45e31d06baf570
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
C++
1
std::cout<<&line1<<std::endl;
выводишь адрес указателя
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
11.09.2012, 00:20     Не работает strcmp + указатели непойми что опять выводят #3
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
std::cout<<&line1<<std::endl;
++line1;/*так как идет приращение я думал, что адрес памяти
в строчке сверху будет меняться, а он какой-то константный....*/
Операция инкремента применительно к указателю не меняет его собственный адрес, а заставляет его указывать на следующую ячейку памяти. Адрес текущего символа на который указывает указатель можно вывести так
C++
1
std::cout << static_cast<const void*>(line1) << std::endl;
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
int i=strcmp(line1,line2);/*независимо от значений массивов line1
line 2 значение i равно 0 , что вообще не вписывается в мое понимание этого мира....как так?*/
После того как вы прогнали эти два цикла
C++
1
2
while(*line1!='\0') ...
while(*line2!='\0') ...
оба указателя стали указывать на конец своих строк, т.е. на символ '\0', следовательно функция strcmp расценивает строки как равные и возвращает 0.
AnreyKazakov
Заблокирован
11.09.2012, 00:40  [ТС]     Не работает strcmp + указатели непойми что опять выводят #4
Разобрался, спасибо за помощь
Elboy
131 / 112 / 4
Регистрация: 01.09.2012
Сообщений: 288
11.09.2012, 00:44     Не работает strcmp + указатели непойми что опять выводят #5
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
const char* line1="Hello"; const char* line2="World";
В этом случае можно изменить то, на что указывает line1, line2, а *line1, *line2 - нельзя.

В случае
C
1
2
char *const line1 = "Hello";
char *const line2 = "World";
Инкремент указателя слова не пройдёт
Yandex
Объявления
11.09.2012, 00:44     Не работает strcmp + указатели непойми что опять выводят
Ответ Создать тему
Опции темы

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