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

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

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

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

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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.06.2016, 13:35
Ответы с готовыми решениями:

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

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

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

18
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
18.06.2016, 13:49
C++
1
2
while (*s1 != '\0')
        s1++; // в цикле определяем позицию конца строки, после всего цикла s1 указывает на нуль-терминатор
C++
1
for ( ; *s1 = *s2; s1++, s2++); // строка s1 расширяется путем добавления символов из s2
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
18.06.2016, 13:51
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
Честно, похоже на пример из книжки "Как не надо программировать на 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
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
18.06.2016, 13:53
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
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
18.06.2016, 13:55
Ferrari F1, И где здесь сокращение, с лишней операцией?
0
92 / 81 / 57
Регистрация: 19.02.2016
Сообщений: 336
18.06.2016, 14:00
Все предельно просто - откомпилируй и посмотри.
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
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
18.06.2016, 14:03
Цитата Сообщение от avgoor Посмотреть сообщение
Неа. Откомпилите, запустите.
http://cpp.sh/57brc

Добавлено через 1 минуту
Цитата Сообщение от avgoor Посмотреть сообщение
И где здесь сокращение, с лишней операцией?
визуально сокращено.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
18.06.2016, 14:03
Ferrari F1, Ваш первоначальный вариант не работал. Я отвечал на него. После того как вы изменили сообщение, я изменил свое.
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
18.06.2016, 14:05
avgoor, я ошибку сразу изменил просто) До вашего ответа)
0
0 / 0 / 1
Регистрация: 02.06.2016
Сообщений: 48
18.06.2016, 14:08  [ТС]
Как бы то ни было, спасибо. Но вот такой вопрос, какое условие выхода из цикла?
C++
1
2
for ( ; *s1 = *s2; s1++, s2++)
         ;//пустой оператор
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
18.06.2016, 14:11
Цитата Сообщение от avgoor Посмотреть сообщение
И где здесь сокращение, с лишней операцией?
Вы правы, торопился, хотел как можно изощреннее написать, ну вот финальный вариант)
C++
1
2
3
4
5
void mystery1(char *s1, const char *s2)
{
    for (; *s1; s1++);
    while(*s1++ = *s2++);
}
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
18.06.2016, 14:12
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
я ошибку сразу изменил просто) До вашего ответа)
Да, бог с ним.
Важно здесь то, что в первом цикле тело не внести в условие.
Цитата Сообщение от RomanFlash Посмотреть сообщение
какое условие выхода из цикла?
Очевидно же, что выражение *s1=*s2 возвращает значение *s1 - которое становится ложным когда цикл дошел до нуль-терминатора.
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
18.06.2016, 14:16
Цитата Сообщение от RomanFlash Посмотреть сообщение
какое условие выхода из цикла?
выход произойдет, когда в *s1 будет содержаться нулевой символ, который был скопирован из *s2, что является ложью, что является условием выхода из цикла.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
18.06.2016, 14:17
Ferrari F1, UPD:
for(; *s1; s1++) по стандарту эквиваленто исходному while - просто разные формы записи.
В отличии от второго цикла.
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
18.06.2016, 14:19
Цитата Сообщение от avgoor Посмотреть сообщение
for(; *s1; s1++) по стандарту эквиваленто исходному while
я просто хочу, чтобы тело цикла было пустым, чтобы было максимально минималистично
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
18.06.2016, 14:27
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
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
18.06.2016, 16:27
Цитата Сообщение от 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
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
18.06.2016, 17:37
Цитата Сообщение от Croessmah Посмотреть сообщение
Если в качестве statement'а поставить continue,
Есть такое. Чтобы обойти - потребовалось бы в одном параграфе определять и for и continue.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.06.2016, 17:37
Помогаю со студенческими работами здесь

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

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

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

Переписать программу с использованием указателей
Всем привет, написал программу теперь нужно сделать его с помощью указателей. помогите пожалуйста #include&lt;iostream&gt; ...

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


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru