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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
RomanFlash
0 / 0 / 0
Регистрация: 02.06.2016
Сообщений: 48
#1

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

18.06.2016, 13:35. Просмотров 400. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2016, 13:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Объясните программу сложения строк с использованием указателей (C++):

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

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

Обработка строк с использованием указателей: вывести слова в два столбика, по четности их длины - C++
Дана строка. Распечатать слова в два столбика. 1 столбик — слова, имеющие четное количество букв, а второй — нечётное. Добавлено через...

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

Переделать программу перемножения матриц с использованием указателей - C++
Помогите переделать эту программу чтобы были указатели!! Вот задание: Дано две матрицы А и В, найти -АВ #include &lt;iostream&gt; ...

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

18
Ferrari F1
594 / 485 / 99
Регистрация: 27.01.2015
Сообщений: 2,877
Записей в блоге: 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
0
avgoor
915 / 550 / 119
Регистрация: 05.12.2015
Сообщений: 1,531
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
Humpty
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
Ferrari F1
594 / 485 / 99
Регистрация: 27.01.2015
Сообщений: 2,877
Записей в блоге: 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
0
avgoor
915 / 550 / 119
Регистрация: 05.12.2015
Сообщений: 1,531
18.06.2016, 13:55 #6
Ferrari F1, И где здесь сокращение, с лишней операцией?
0
nstwf
87 / 77 / 32
Регистрация: 19.02.2016
Сообщений: 336
Завершенные тесты: 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;
 
}
0
Ferrari F1
594 / 485 / 99
Регистрация: 27.01.2015
Сообщений: 2,877
Записей в блоге: 1
Завершенные тесты: 1
18.06.2016, 14:03 #8
Цитата Сообщение от avgoor Посмотреть сообщение
Неа. Откомпилите, запустите.
http://cpp.sh/57brc

Добавлено через 1 минуту
Цитата Сообщение от avgoor Посмотреть сообщение
И где здесь сокращение, с лишней операцией?
визуально сокращено.
0
avgoor
915 / 550 / 119
Регистрация: 05.12.2015
Сообщений: 1,531
18.06.2016, 14:03 #9
Ferrari F1, Ваш первоначальный вариант не работал. Я отвечал на него. После того как вы изменили сообщение, я изменил свое.
0
Ferrari F1
594 / 485 / 99
Регистрация: 27.01.2015
Сообщений: 2,877
Записей в блоге: 1
Завершенные тесты: 1
18.06.2016, 14:05 #10
avgoor, я ошибку сразу изменил просто) До вашего ответа)
0
RomanFlash
0 / 0 / 0
Регистрация: 02.06.2016
Сообщений: 48
18.06.2016, 14:08  [ТС] #11
Как бы то ни было, спасибо. Но вот такой вопрос, какое условие выхода из цикла?
C++
1
2
for ( ; *s1 = *s2; s1++, s2++)
         ;//пустой оператор
0
Ferrari F1
594 / 485 / 99
Регистрация: 27.01.2015
Сообщений: 2,877
Записей в блоге: 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++);
}
0
avgoor
915 / 550 / 119
Регистрация: 05.12.2015
Сообщений: 1,531
18.06.2016, 14:12 #13
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
я ошибку сразу изменил просто) До вашего ответа)
Да, бог с ним.
Важно здесь то, что в первом цикле тело не внести в условие.
Цитата Сообщение от RomanFlash Посмотреть сообщение
какое условие выхода из цикла?
Очевидно же, что выражение *s1=*s2 возвращает значение *s1 - которое становится ложным когда цикл дошел до нуль-терминатора.
0
Ferrari F1
594 / 485 / 99
Регистрация: 27.01.2015
Сообщений: 2,877
Записей в блоге: 1
Завершенные тесты: 1
18.06.2016, 14:16 #14
Цитата Сообщение от RomanFlash Посмотреть сообщение
какое условие выхода из цикла?
выход произойдет, когда в *s1 будет содержаться нулевой символ, который был скопирован из *s2, что является ложью, что является условием выхода из цикла.
0
avgoor
915 / 550 / 119
Регистрация: 05.12.2015
Сообщений: 1,531
18.06.2016, 14:17 #15
Ferrari F1, UPD:
for(; *s1; s1++) по стандарту эквиваленто исходному while - просто разные формы записи.
В отличии от второго цикла.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2016, 14:17
Привет! Вот еще темы с ответами:

Написать программу,которая меняет порядок цифр с использованием указателей - C++
Сказали написать прогу,которая меня порядок цифр (1234-4321).Но с использованием указателей. Вот код,который изменяет строку,но куда...

Составить программу на языке C++ для обработки двумерных массивов с использованием указателей - C++
Дана матрица порядка n. Найти в последнем столбце max и min. Если в матрице есть нули, то заменить их суммой max и min последнего столбца. ...

Составить программу на языке C++ для обработки двумерных массивов с использованием указателей - C++
Составить программу на языке C++ для обработки двумерных массивов с использованием указателей. Очень срочно. Завтра экзамен.

Напишите программу, присваивающую значения элементов списка указателей на символьные строки в стиле С (тип char* ) элементам вектора строк - C++
Напишите программу, присваивающую значения элементов списка указателей на символьные строки в стиле С (тип char* ) элементам вектора строк...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
18.06.2016, 14:17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru