Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объясните работу 6 строк кода, не могу разобраться 
V
    Опции темы
Black
Дата 26.4.2007, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Web-Development
**


Профиль
Группа: Участник
Сообщений: 980
Регистрация: 15.8.2004

Репутация: нет
Всего: 45



Недавно начал учить C

Не могу понять код:

Код

void main()
{
    char s[] = "Удалить пробелы и табуляции из строки";
    char *ss, *sd;

    printf("было: %s\n", s);

    for(ss=sd=s; *sd=*ss; ss++)
        if(!(*ss==' ' || *ss=='\t')) sd++;

    printf("стало: %s\n", s);
}


Все, впринципе, понятно, но то как работает цикл for() с указателями ставит меня в тупик  smile 
Объясните, пожалуйста.


Это сообщение отредактировал(а) Black - 26.4.2007, 23:43


--------------------
Могу все, но ничего не умею :-)
PM WWW   Вверх
archimed7592
Дата 26.4.2007, 23:48 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



ss=sd=s
эквивалентно
sd = s;
ss = sd;
т. е. инициализируешь ss и sd значением s
*sd=*ss - копируешь символ на кот. указывает ss по адресу на кот. указывает sd
ss++ - сдвигаешь этот указатель на след символ
если *ss не пробел и не табуляция, то сдвигаешь и sd...
другими словами, destination(sd) сдвигаешь ток тогда, когда скопирован был не пробел и не табуляция
ну а source(ss) сдвигаешь всегда...
поскольку строки кончаются нулём - *sd=*ss когда-нибудь вернёт 0 (скопирован 0) и тогда цикл завершится smile

зы. да уж... жестячок получился...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Black
Дата 26.4.2007, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Web-Development
**


Профиль
Группа: Участник
Сообщений: 980
Регистрация: 15.8.2004

Репутация: нет
Всего: 45



А как получается, что потом выводят в экран переменную s и она уже без пробелов и знаков табуляции.. хотя в for нет упоминаний о переменной s?


--------------------
Могу все, но ничего не умею :-)
PM WWW   Вверх
Xenon
Дата 27.4.2007, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Black, Почему нет? Мы ею иницилизируем ss и sd.


--------------------
user posted image  
PM MAIL   Вверх
BigHeart
Дата 27.4.2007, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 17.3.2007

Репутация: нет
Всего: нет



просто и s и ss и sd это указатели, котоые указывают на одну и ту же область памяти
PM MAIL   Вверх
Rockie
Дата 28.4.2007, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Black, есть переменная, которая содержит какое-то значение:
Код

int x = 3;

У каждой переменной есть адрес, его можно получить с помощью &:
Код

cout<<&x;

Указатель - это переменная, содержащая такие адреса. Объявим указатель, содержащий в себе адрес переменной x:
Код

int* y = &x;

У нас есть указатель, содержащий в себе адрес перемнной x. Мы хотим через этот указатель получить значение переменной x. Для этого применяется *(разыменование указателя):
Код

cout<<*x;


Ну и в конце концов, у указателя тоже есть адрес:
Код

cout<<&y;


Тогда получаем:
Код

#include<cstdio>

int main()
{
    // массив s[] содержит строку символов, так как есть кавчки,
    // компилятор добавит в конец строки ноль (символ '\0', окончание строки )
    char s[] = "Delete spaces and tabulations";    
    printf("was: %s\n", s);    

    // объявим 2 указателя на сомволы, пока они не инициализированы, в них мусор вместо адресов
    char *ss, *sd;    
    
    //запись s обозначает адрес начала массива, его первого элемента.
    // cout<<s; это то же самое что cout<<&s[0];
    for(ss=sd=s;  // приравниваем оба указателя к s, все теперь указывают на начало массива
        *sd=*ss;  // пока можно приравнять значение по адресу ss значению по адресу sd
                  // (на первой итерации это будет s[0]=s[0];)
        ss++)      // перемещаем указатель ss
        // В общем ss постоянно бежит по массиву и каждый раз меняется с sd, а sd увеличивается
        // только в случае, когда обмен произошел с символом, а не с пробелом
         if(!(*ss==' ' || *ss=='\t')) sd++;
    // поэтому табуляция и пробелы в обменах участвуют, но в массив не попадают
    printf("becomes: %s\n", s);

    return 0;
}




Это сообщение отредактировал(а) Rockie - 28.4.2007, 17:08


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1035 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.