Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 1
Регистрация: 02.06.2016
Сообщений: 48
1

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

18.06.2016, 13:35. Показов 1601. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
// Программа на СИ )))

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

Спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.06.2016, 13:35
Ответы с готовыми решениями:

Составить программу на языке С++ для обработки строк с использованием указателей
Дана строка. На печать выдать слова, которые имеют четную длину и одинаковые первую и последние...

Объясните как записать код программы с использованием указателей
Раскрасить в массиве при выводе бирюзовым цветом отрицательные элементы на главной диагонали,...

С использованием функций и указателей отсортировать строки массива строк по убыванию
Суть задачи: с использование функций и указателей отсортировать строки массива строк по убыванию....

Переделать программу с использованием указателей
Помогите переделать программу под указатели: #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include...

18
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
18.06.2016, 13:49 2
C++
1
2
while (*s1 != '\0')
        s1++; // в цикле определяем позицию конца строки, после всего цикла s1 указывает на нуль-терминатор
C++
1
for ( ; *s1 = *s2; s1++, s2++); // строка s1 расширяется путем добавления символов из s2
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
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
0
14 / 14 / 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 в начале второго цикла указывал на конец строки.

А потом функция возвращает ноль, что бы это не значило...
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 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
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
18.06.2016, 13:55 6
Ferrari F1, И где здесь сокращение, с лишней операцией?
0
92 / 81 / 57
Регистрация: 19.02.2016
Сообщений: 336
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;
 
}
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
18.06.2016, 14:03 8
Цитата Сообщение от avgoor Посмотреть сообщение
Неа. Откомпилите, запустите.
http://cpp.sh/57brc

Добавлено через 1 минуту
Цитата Сообщение от avgoor Посмотреть сообщение
И где здесь сокращение, с лишней операцией?
визуально сокращено.
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
18.06.2016, 14:03 9
Ferrari F1, Ваш первоначальный вариант не работал. Я отвечал на него. После того как вы изменили сообщение, я изменил свое.
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
18.06.2016, 14:05 10
avgoor, я ошибку сразу изменил просто) До вашего ответа)
0
0 / 0 / 1
Регистрация: 02.06.2016
Сообщений: 48
18.06.2016, 14:08  [ТС] 11
Как бы то ни было, спасибо. Но вот такой вопрос, какое условие выхода из цикла?
C++
1
2
for ( ; *s1 = *s2; s1++, s2++)
         ;//пустой оператор
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 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++);
}
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
18.06.2016, 14:12 13
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
я ошибку сразу изменил просто) До вашего ответа)
Да, бог с ним.
Важно здесь то, что в первом цикле тело не внести в условие.
Цитата Сообщение от RomanFlash Посмотреть сообщение
какое условие выхода из цикла?
Очевидно же, что выражение *s1=*s2 возвращает значение *s1 - которое становится ложным когда цикл дошел до нуль-терминатора.
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
18.06.2016, 14:16 14
Цитата Сообщение от RomanFlash Посмотреть сообщение
какое условие выхода из цикла?
выход произойдет, когда в *s1 будет содержаться нулевой символ, который был скопирован из *s2, что является ложью, что является условием выхода из цикла.
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
18.06.2016, 14:17 15
Ferrari F1, UPD:
for(; *s1; s1++) по стандарту эквиваленто исходному while - просто разные формы записи.
В отличии от второго цикла.
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
18.06.2016, 14:19 16
Цитата Сообщение от avgoor Посмотреть сообщение
for(; *s1; s1++) по стандарту эквиваленто исходному while
я просто хочу, чтобы тело цикла было пустым, чтобы было максимально минималистично
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
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;
}
}
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 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;
   }
}
Почему это происходит, думаю, объяснять не нужно.
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
18.06.2016, 17:37 19
Цитата Сообщение от Croessmah Посмотреть сообщение
Если в качестве statement'а поставить continue,
Есть такое. Чтобы обойти - потребовалось бы в одном параграфе определять и for и continue.
0
18.06.2016, 17:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.06.2016, 17:37
Помогаю со студенческими работами здесь

Переписать программу с использованием указателей
поменяйте, пожалуйста, из индексов в указатели #include &lt;stdio.h&gt;; int cmp_cresc ( const int* x,...

Доработать программу с использованием указателей
Необходимо доработать программу с использованием указателей. using System; namespace _1 { class...

Переписать программу с использованием указателей
Всем привет, написал программу теперь нужно сделать его с помощью указателей. помогите пожалуйста ...

Переделать программу с использованием указателей
Прошу помощи, переделать программу с использованием указателей. #include &lt;stdio.h&gt; int main() {...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru