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

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

11.11.2016, 00:50. Показов 4339. Ответов 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
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
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
Ответ Создать тему
Новые блоги и статьи
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, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru