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

Объясните программу сложения строк с использованием указателей - C++

Восстановить пароль Регистрация
 
RomanFlash
0 / 0 / 0
Регистрация: 02.06.2016
Сообщений: 41
18.06.2016, 13:35     Объясните программу сложения строк с использованием указателей #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
#include <stdio.h>
 
int main()
{
    char string1[80];
    char string2[80];
 
    scanf("%s%s",string1,string2);
 
    mystery1(string1,string2);
 
    printf("%s",string1);
    
    getch();
 
 
}        
 
int mystery1(char *s1, const char *s2)
{
    while (*s1 != '\0')
        s1++;
 
    for ( ; *s1 = *s2; s1++, s2++)
         ;//пустой оператор
         
   return 0;         
    
} //конец mystery
В задании написано определить что делает данная программа. Простым методом ввел - откомпилировал я выяснил, что программа складывает строки. Объясните КАК?? Именно как работает функция mystery1

Спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2016, 13:35     Объясните программу сложения строк с использованием указателей
Посмотрите здесь:

Напишите программу, присваивающую значения элементов списка указателей на символьные строки в стиле С (тип char* ) элементам вектора строк C++
Надо написать программу на С++ с использованием указателей C++
С использованием функций и указателей отсортировать строки массива строк по убыванию C++
Обработка строк с использованием указателей: вывести слова в два столбика, по четности их длины C++
C++ Составить программу на языке С++ для обработки строк с использованием указателей
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ferrari F1
Заблокирован
295 / 281 / 61
Регистрация: 27.01.2015
Сообщений: 1,889
Записей в блоге: 1
Завершенные тесты: 1
18.06.2016, 13:49     Объясните программу сложения строк с использованием указателей #2
C++
1
2
while (*s1 != '\0')
        s1++; // в цикле определяем позицию конца строки, после всего цикла s1 указывает на нуль-терминатор
C++
1
for ( ; *s1 = *s2; s1++, s2++); // строка s1 расширяется путем добавления символов из s2
avgoor
562 / 352 / 83
Регистрация: 05.12.2015
Сообщений: 1,137
18.06.2016, 13:51     Объясните программу сложения строк с использованием указателей #3
RomanFlash, Можно еще сократить:
C++
1
2
3
4
5
6
7
8
9
10
11
int mystery1(char *s1, const char *s2)
{
    while (*s1 != '\0')
        s1++;
 
    while ( *s1++ = *s2++)
         ;//пустой оператор
         
   return 0;         
    
} //конец mystery
Humpty
13 / 13 / 5
Регистрация: 10.03.2016
Сообщений: 35
18.06.2016, 13:52     Объясните программу сложения строк с использованием указателей #4
Честно, похоже на пример из книжки "Как не надо программировать на C++" (кстати, классная, почитайте)

C++
1
2
while (*s1 != '\0')
        s1++;
Хорошая строка на C кончается нуль-символом (\0). Мы берем указатель s1, смотрим на значение за ним, если оно не равно нулю, инкрементим указатель. Как только дошли до нуль-символа, указатель s1 смотрит на конец строки.

C++
1
2
  for ( ; *s1 = *s2; s1++, s2++)
         ;//пустой оператор
Начнем с того, что этот цикл эквивалентен следующему

C++
1
2
3
4
while (*s1 = *s2) {
  s1++;
  s2++;
}
В условии происходит следующее, значение за указателем s2 присваевается по адресу s1. Сам по себе оператор присвоения возвращает значение присваемого значения. Т.е. если кто-то напишет
C++
1
return a = 42;
то функция вернет 42.

Здесь, если по адресу s2 лежал нуль-символ, то цикл прервется. Понятно, в теле цикла мы просто двигаем вперед оба указателя s1 и s2. При этом s1 в начале второго цикла указывал на конец строки.

А потом функция возвращает ноль, что бы это не значило...
Ferrari F1
Заблокирован
295 / 281 / 61
Регистрация: 27.01.2015
Сообщений: 1,889
Записей в блоге: 1
Завершенные тесты: 1
18.06.2016, 13:53     Объясните программу сложения строк с использованием указателей #5
avgoor, Можно еще сократить:
C++
1
2
3
4
5
6
7
8
9
int mystery1(char *s1, const char *s2)
{
    while (*s1++);
    --s1;
    while(*s1++ = *s2++);
         
   return 0;         
    
} //конец mystery
avgoor
562 / 352 / 83
Регистрация: 05.12.2015
Сообщений: 1,137
18.06.2016, 13:55     Объясните программу сложения строк с использованием указателей #6
Ferrari F1, И где здесь сокращение, с лишней операцией?
nstwf
86 / 76 / 30
Регистрация: 19.02.2016
Сообщений: 324
Завершенные тесты: 1
18.06.2016, 14:00     Объясните программу сложения строк с использованием указателей #7
Все предельно просто - откомпилируй и посмотри.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void mystery1(char *s1, const char *s2)
{
    while (*s1 != '\0')
    {
        s1++;
        cout << s1;
    }
    for (; *s1 = *s2; s1++, s2++)
        cout << "s1=" << *s1 << "\t\t" << "s2=" << s2<< endl;//пустой оператор
 
    return;
 
}
Ferrari F1
Заблокирован
295 / 281 / 61
Регистрация: 27.01.2015
Сообщений: 1,889
Записей в блоге: 1
Завершенные тесты: 1
18.06.2016, 14:03     Объясните программу сложения строк с использованием указателей #8
Цитата Сообщение от avgoor Посмотреть сообщение
Неа. Откомпилите, запустите.
http://cpp.sh/57brc

Добавлено через 1 минуту
Цитата Сообщение от avgoor Посмотреть сообщение
И где здесь сокращение, с лишней операцией?
визуально сокращено.
avgoor
562 / 352 / 83
Регистрация: 05.12.2015
Сообщений: 1,137
18.06.2016, 14:03     Объясните программу сложения строк с использованием указателей #9
Ferrari F1, Ваш первоначальный вариант не работал. Я отвечал на него. После того как вы изменили сообщение, я изменил свое.
Ferrari F1
Заблокирован
295 / 281 / 61
Регистрация: 27.01.2015
Сообщений: 1,889
Записей в блоге: 1
Завершенные тесты: 1
18.06.2016, 14:05     Объясните программу сложения строк с использованием указателей #10
avgoor, я ошибку сразу изменил просто) До вашего ответа)
RomanFlash
0 / 0 / 0
Регистрация: 02.06.2016
Сообщений: 41
18.06.2016, 14:08  [ТС]     Объясните программу сложения строк с использованием указателей #11
Как бы то ни было, спасибо. Но вот такой вопрос, какое условие выхода из цикла?
C++
1
2
for ( ; *s1 = *s2; s1++, s2++)
         ;//пустой оператор
Ferrari F1
Заблокирован
295 / 281 / 61
Регистрация: 27.01.2015
Сообщений: 1,889
Записей в блоге: 1
Завершенные тесты: 1
18.06.2016, 14:11     Объясните программу сложения строк с использованием указателей #12
Цитата Сообщение от avgoor Посмотреть сообщение
И где здесь сокращение, с лишней операцией?
Вы правы, торопился, хотел как можно изощреннее написать, ну вот финальный вариант)
C++
1
2
3
4
5
void mystery1(char *s1, const char *s2)
{
    for (; *s1; s1++);
    while(*s1++ = *s2++);
}
avgoor
562 / 352 / 83
Регистрация: 05.12.2015
Сообщений: 1,137
18.06.2016, 14:12     Объясните программу сложения строк с использованием указателей #13
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
я ошибку сразу изменил просто) До вашего ответа)
Да, бог с ним.
Важно здесь то, что в первом цикле тело не внести в условие.
Цитата Сообщение от RomanFlash Посмотреть сообщение
какое условие выхода из цикла?
Очевидно же, что выражение *s1=*s2 возвращает значение *s1 - которое становится ложным когда цикл дошел до нуль-терминатора.
Ferrari F1
Заблокирован
295 / 281 / 61
Регистрация: 27.01.2015
Сообщений: 1,889
Записей в блоге: 1
Завершенные тесты: 1
18.06.2016, 14:16     Объясните программу сложения строк с использованием указателей #14
Цитата Сообщение от RomanFlash Посмотреть сообщение
какое условие выхода из цикла?
выход произойдет, когда в *s1 будет содержаться нулевой символ, который был скопирован из *s2, что является ложью, что является условием выхода из цикла.
avgoor
562 / 352 / 83
Регистрация: 05.12.2015
Сообщений: 1,137
18.06.2016, 14:17     Объясните программу сложения строк с использованием указателей #15
Ferrari F1, UPD:
for(; *s1; s1++) по стандарту эквиваленто исходному while - просто разные формы записи.
В отличии от второго цикла.
Ferrari F1
Заблокирован
295 / 281 / 61
Регистрация: 27.01.2015
Сообщений: 1,889
Записей в блоге: 1
Завершенные тесты: 1
18.06.2016, 14:19     Объясните программу сложения строк с использованием указателей #16
Цитата Сообщение от avgoor Посмотреть сообщение
for(; *s1; s1++) по стандарту эквиваленто исходному while
я просто хочу, чтобы тело цикла было пустым, чтобы было максимально минималистично
avgoor
562 / 352 / 83
Регистрация: 05.12.2015
Сообщений: 1,137
18.06.2016, 14:27     Объясните программу сложения строк с использованием указателей #17
6.5.3 The for statement
1 The for statement
for (for-init-statement condition; expression) statement
is equivalent to
{
for-init-statement
while (condition) {
statement
expression;
}
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11816 / 6795 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
18.06.2016, 16:27     Объясните программу сложения строк с использованием указателей #18
Цитата Сообщение от RomanFlash Посмотреть сообщение
Программа на СИ
И причем здесь C++?

Добавлено через 3 минуты
avgoor, но тут есть один казус.
Если в качестве statement'а поставить continue,
то for и while станут работать по разному:
C++
1
2
3
for(int i = 0; i<10; ++i){//всё 'ok'
   continue;
}
переделаем по указанной выше схеме:
C++
1
2
3
4
5
6
7
{
   int i = 0;
   while (i<10) {//бесконечный цикл
      continue;
      ++i;
   }
}
Почему это происходит, думаю, объяснять не нужно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2016, 17:37     Объясните программу сложения строк с использованием указателей
Еще ссылки по теме:

C++ Объясните работу указателей
Переделать программу перемножения матриц с использованием указателей C++
C++ Написать программу,которая меняет порядок цифр с использованием указателей

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

Или воспользуйтесь поиском по форуму:
avgoor
562 / 352 / 83
Регистрация: 05.12.2015
Сообщений: 1,137
18.06.2016, 17:37     Объясните программу сложения строк с использованием указателей #19
Цитата Сообщение от Croessmah Посмотреть сообщение
Если в качестве statement'а поставить continue,
Есть такое. Чтобы обойти - потребовалось бы в одном параграфе определять и for и continue.
Yandex
Объявления
18.06.2016, 17:37     Объясните программу сложения строк с использованием указателей
Ответ Создать тему
Опции темы

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