С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 31.08.2016
Сообщений: 38

Функция принимает любое количество строк а затем складывает их

11.11.2016, 00:50. Показов 4302. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день
Нужно написать функция которая принимала бы любое количество строк а затем складывала их
Возвращаемое значение. Вопрос только один как мне эти параметры считать? посимвольно до конца строки очередной гонять весь стек разбивая его на строки или же есть какойто более сладенький метод. Спасибо

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
StringClass strGlue(int strNumber, ...)
{
    char* detective;
    detctive = &strNumber + 4;
    for (int i = 0; i < strNumber; i++)
    {
        while (detective)
        {
            detective++;
        }
 
 
        ...
    }
/*
Вот както так выгледит это в моей голове сейчас. Типо потом я както должен передавать эти строки
методу класса который дудет у меня переменную класса типа char* pString; перекидывать на новый
динамический массив в который будет копироваться старая строка на которую указывает указатель в
классе и новая типо того.
*/
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.11.2016, 00:50
Ответы с готовыми решениями:

Функция F1, которая не принимает и не возвращает значений, но выводит на экран любое сообщение
На языке С/C++ написать программу в которой имеется функция F1, которая не принимает и не возвращает значений, но выводит на экран любое...

Функция принимает массив строк в качестве аргумента
Создайте страницу, содержащую функцию, реализованную на JavaScript со следующим функционалом. Функция принимает массив строк в качестве...

Почему функция копирования строк не принимает два параметра?
Собсно. IDE MSVS #include &lt;windows.h&gt; #include &lt;stdio.h&gt; int main(){ } char* f (char* x, char* y) { strcpy_s (x, y); } ...

14
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.11.2016, 07:36
Лучший ответ Сообщение было отмечено MrGluck как решение

Решение

Цитата Сообщение от o4enslabijcoder Посмотреть сообщение
сладенький метод
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
 
std::string concatenation(auto&&... strs)
{
    std::string result;
    char dummy[] = { (result += strs, 0)... };
    (void) dummy;
    return result;
}
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    const auto result = concatenation("мама ", "мыла ", "раму");
    
    std::cout << result << std::endl;
}
7
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
11.11.2016, 12:16
На вариадиках
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
 
std::string concat(const std::string &s)
{
    return s;
}
 
template <typename ...U>
std::string concat(const std::string &s, const U &... u)
{
    return concat(s) + concat(u...);
}
 
int main()
{
    std::cout << concat("eniki", " beniki", " eli", " vareniki") << std::endl;
}
2
0 / 0 / 0
Регистрация: 31.08.2016
Сообщений: 38
11.11.2016, 12:27  [ТС]
Спасибо за оперативный ответ. Хотел бы уточнить.
1)
C
1
auto&&... strs
Что говорит нам это описание параметров и как оно работает. Знаю что форма && используется на ряду с const для того чтобы сделать просто число lvalue c C++11. Но с подобными записями я не встречался. Подозреваю что авто имеет какое-то отношение к инту. Попробывал погуглить инфы не нашел(
2)мы создали пустую строку и массив хотим проинициалировать просто всеми введенными параметрами а вконцу поставить завершающий 0 для того чтобы его можно было инторпретировать как строку? Если это так то зачем там перед скобкой фигурной
C
1
...
3)
C
1
(void) dummy
это я так понимаю форма офнуления массива? Просто первый раз с таким встречаюсь хотел бы узнать что оно точно делает?
просто этот самый массив и так удаляется(тк он локальный в функции)


Спасибо.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
11.11.2016, 13:09
Вот парочка ссылок для размышления.
Особое внимание на parameter pack.
0
Почетный модератор
 Аватар для ildwine
6201 / 2963 / 1300
Регистрация: 04.03.2013
Сообщений: 5,797
Записей в блоге: 1
30.11.2016, 20:42
Цитата Сообщение от hoggy Посмотреть сообщение
char dummy[] = { (result += strs, 0)... };
* * (void) dummy;
Респект полнейший, а можно растолковать механизм этих строк?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.12.2016, 07:32
Цитата Сообщение от ildwine Посмотреть сообщение
Респект полнейший, а можно растолковать механизм этих строк?
рассмотрим простейшую инициализацию массива:
C++
1
char dummy[] = { 0,0,0 }; // массив из трех элементов заполненный нулями
теперь усложним конструкцию:
C++
1
2
3
4
5
char dummy[] = { 
    (result += strs, 0),  // <--- оператор запятая. 
    (result += strs, 0),    
    (result += strs, 0),
}; // массив из трех элементов заполненный нулями
в примере выше сначала выполнится левостороннее выражение result += strs,
но в качестве результирующего значения элемента массива берется правосторонний ноль.

ну и теперь наша конструкция:
C++
1
2
3
4
5
6
char dummy[] = { 
    // количество элементов массива получается равным количеству переданных аргументов
    // каждый элемент инициализируются нулем
    // при этом для каждого конкретного strs выполняется операция result += strs
    (result += strs, 0)...   
};
Добавлено через 1 минуту
Цитата Сообщение от ildwine Посмотреть сообщение
(void) dummy;
эта инструкция сообщает компилятору, что мы в курсе,
что массив нигде далее по коду не используется.
и что компилятору не нужно нас об этом предупреждать.
1
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
03.12.2016, 23:36
Кстати, DrOffset недавно показывал примерно такую конструкцию:
C++
1
(int[]) { (args)... };
По-моему гораздо меньше телодвижений.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
04.12.2016, 00:21
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
 
// main.cpp:5:21: warning: ISO C++ forbids use of 'auto' in parameter declaration [-Wpedantic]
//  std::string conc_1( auto && ... strs ) {
std::string conc_1( auto && ... strs ) {
    std::string result;
    char dummy[] = { (result += strs, 0)... };
    (void)dummy;
    return result;
}
 
// main.cpp:14:21: warning: ISO C++ forbids use of 'auto' in parameter declaration [-Wpedantic]
//  std::string conc_2( auto && ... strs ) {
std::string conc_2( auto && ... strs ) {
    std::string result;
 
    // main.cpp: In function 'std::__cxx11::string conc_2(auto:2&& ...)':
    // main.cpp:20:36: warning: ISO C++ forbids compound-literals [-Wpedantic]
    //   (int []){ (result += strs, 0) ... };
    (int []){ (result += strs, 0) ... };
 
    return result;
}
 
// ok
template <typename ... Ss>
std::string conc_3( Ss && ... strs ) {
    std::string result;
    using foo = int [];
    foo{ (result += strs, 0) ... };
    return result;
}
 
int main() {
    // main.cpp: In instantiation of 'std::__cxx11::string conc_1(auto:1&& ...) [with auto:1 = {const char (&)[6], const char (&)[6], const char (&)[5]}; std::__cxx11::string = std::__cxx11::basic_string<char>]':
    // main.cpp:42:48:   required from here
    // main.cpp:7:42: warning: narrowing conversion of '(((void)result.std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator+=<char, std::char_traits<char>, std::allocator<char> >(((const char*)strs#0))), 0)' from 'int' to 'char' inside { } [-Wnarrowing]
    //   char dummy[] = { (result += strs, 0)... };
    //                                           ^
    // main.cpp:7:42: warning: narrowing conversion of '(((void)result.std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator+=<char, std::char_traits<char>, std::allocator<char> >(((const char*)strs#1))), 0)' from 'int' to 'char' inside { } [-Wnarrowing]
    // main.cpp:7:42: warning: narrowing conversion of '(((void)result.std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator+=<char, std::char_traits<char>, std::allocator<char> >(((const char*)strs#2))), 0)' from 'int' to 'char' inside { } [-Wnarrowing]
    std::cout << conc_1( "мама ", "мыла ", "раму" ) << std::endl;
 
    // ok, but lines 14 and 20
    std::cout << conc_2( "мама ", "мыла ", "раму" ) << std::endl;
 
    // ok
    std::cout << conc_3( "мама ", "мыла ", "раму" ) << std::endl;
}
command line
Bash
1
g++ main.cpp -Wall -pedantic -std=c++17 -o main.exe
gcc -v
Bash
1
2
3
4
5
6
7
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/6.2.0/lto-wrapper.exe
Target: i686-w64-mingw32
Configured with: ../gcc-6.2.0/configure --prefix=/mingw32 --with-local-prefix=/mingw32/local --build=i686-w64-mingw32 --host=i686-w64-mingw32 --target=i686-w64-mingw32 --with-native-system-header-dir=/mingw32/i686-w64-mingw32/include --libexecdir=/mingw32/lib --enable-bootstrap --with-arch=i686 --with-tune=generic --enable-languages=c,lto,c++,objc,obj-c++,fortran,ada --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-time=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --disable-isl-version-check --enable-lto --enable-libgomp --disable-multilib --enable-checking=release --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/mingw32 --with-mpfr=/mingw32 --with-mpc=/mingw32 --with-isl=/mingw32 --with-pkgversion='Rev2, Built by MSYS2 project' --with-bugurl=https://sourceforge.net/projects/msys2 --with-gnu-as --with-gnu-ld --disable-sjlj-exceptions --with-dwarf2
Thread model: posix
gcc version 6.2.0 (Rev2, Built by MSYS2 project)
1
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
04.12.2016, 00:39
В таком случае больше телодвижений.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//ok
template<class... _Args>
std::string conc_2( _Args&&... strs ) 
{
    std::string result;
    
    int dummy[]{ (result += strs, 0)... };
    (void)dummy;
    return result;
}
 
int main()
{
    //ok
    std::cout << conc_2("mama", " mila ", "ramu");
}
А вообще можно такой тайпдеф применить, если таких функций несколько.
C++
1
2
template<typename _Tp>
using Type_array = _Tp[];
И писать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template<typename _Tp>
using Type_array = _Tp[];
 
//ok
template<class... _Args>
std::string conc_2( _Args&&... strs ) 
{
    std::string result;
    
    Type_array<int>{ (result += strs, 0)... };
    return result;
}
 
int main()
{
    //ok
    std::cout << conc_2("mama", " mila ", "ramu");
}
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
04.12.2016, 00:46
GbaLog-, можно, но мне больше импонирует соответствие стандарту чем "экономия на спичках".
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
04.12.2016, 01:06
Цитата Сообщение от GbaLog- Посмотреть сообщение
По-моему гораздо меньше телодвижений.
Да, только эта конструкция нестандартная.

Точнее, она стандартная для С99 и выше.
А gcc и clang поддерживают ее в качестве расширения для С++.
См. здесь: https://gcc.gnu.org/onlinedocs... erals.html
2
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
04.12.2016, 11:42
Цитата Сообщение от GbaLog- Посмотреть сообщение
В таком случае больше телодвижений.
Зато сразу понятно предназначение dummy[]. Мне, например, первый вариант читать было бы проще.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.12.2016, 21:28
Цитата Сообщение от GbaLog- Посмотреть сообщение
_Args
UB. все имена начинающиеся со знака подчеркивания зарезервированы для нужд языка.
грамотные любители подчеркиваний ставят черточки в конце имени, а не в начале.
3
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
06.12.2016, 21:35
А мужчина сверху прав 2.10.3:
In addition, some identifiers are reserved for use by C++ implementations and shall not be used otherwise;
no diagnostic is required.
(3.1) — Each identifier that contains a double underscore __ or begins with an underscore followed by an
uppercase letter is reserved to the implementation for any use.
(3.2) — Each identifier that begins with an underscore is reserved to the implementation for use as a name in
the global namespace.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.12.2016, 21:35
Помогаю со студенческими работами здесь

Написать программу, которая запрашивает массив из N целых чисел, а затем складывает все элементы
Написать программу, которая запрашивает массив из N целых чисел, а затем складывает все элементы с нечётными номерами и все элементы с...

Функция, которая принимает в качестве параметров вещественное число и количество знаков после десятичной точки
Доброго вечера,подскажите пожалуйста как можно решить задачку,(существует функция, которая принимает в качестве параметров вещественное...

Функция принимает неопределённое количество имён файлов и результирующую папку. Она копирует все перечисленные файлы
Функция принимает неопределённое количество имён файлов и результирующую папку. Она копирует все перечисленные файлы в эту папку. ...

Функция находит и складывает определённые числа в столбце
Помогите написать функцию, которая будет искать наибольшие(наименьшее) числа в диапазоне и складывать их указонное количество....

Функция, которая складывает целочисленное содержимое списка и добавляет каждую сумму в список
Написать функцию, которая производит арифметические действия над значения списка не сложно, а вот как сложить каждую сумму в список? Что-то...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru