LINUX.ORG.RU

Собрать строку из аргументов в C++

 


0

3

Да я понимаю что здесь мешанина с++11 и с++98(?)

Надо получить объединённую строку из параметров командной строки:

Сделал такой корявокод:

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

using namespace std;

int main(int argc, char *argv[])
{
    char * devicestr {}; //инициализация в стиле C++11 не ругайте, но так удобно
    char * numstr {};
    int port = 0;

    string concated_string {};

        cout << argv[0];
        for (int i = 1; i < argc; i++) {
            if (i + 1 != argc) {
                if (0 == strcmp("--devicestr", argv[i])) {
                    devicestr = argv[i + 1];
                } else (0 == strcmp("--port", argv[i])) {
                    port = std::stoi(argv[i + 1]);
                } else if (0 == strcmp("--numstr", argv[i])) {
                    numstr = argv[i + 1];
                }
            }
        }
    std::string str1(devicestr);
    std::string str2(numstr);
    concated_string = str1 + ":"+ std::to_string(port) + "/"+str2;
    cout << concated_string;
    return 0;
}

Ошибка такая: Error call overloaded «to_string(int&)» is ambiguous

как вообще правильно делать такие преобразования?

★★★★★

Последнее исправление: sniper21 (всего исправлений: 2)

Ответ на: комментарий от kawaii_neko

Вот давай и иди в 3,14ду. Если не можешь нормально общаться - деточка.

Silerus ★★★★
()
Ответ на: комментарий от kawaii_neko

мимокрокодил

Ну вообще-то это ты выкатил типичный поток сознания, искалеченного ассемблером. Фрагментация кучи, серьезно? На трех аллокациях? С моментальной деаллокацией? На старте программы? Какие-то детские понты.

Конечно, можно написать эффективнее, только разницы ты и замерить не сможешь.

anonymous
()
Ответ на: мимокрокодил от anonymous

Фрагментация кучи, серьезно? На трех аллокациях? С моментальной деаллокацией? На старте программы? Какие-то детские понты.

Ну отчасти он прав, если человек пишет так, то есть вероятность сильно больше 0, что он будет делать кучу ненужных аллокаций везде, а не только в начале.

Dudraug ★★★★★
()
Ответ на: комментарий от RazrFalcon

Зачем?

Затем, что пользы и смысла от ваших комментариев ни там, ни там, не было бы. Ну лишний раз свое хейтерство вы бы продемонстрировали бы, может вам полегчало бы чутка больше.

eao197 ★★★★★
()
Ответ на: комментарий от Dudraug

есть вероятность сильно больше 0, что он будет делать кучу ненужных аллокаций везде, а не только в начале.

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

anonymous
()
Ответ на: комментарий от anonymous

Читаю Прата 6-ое издание. Глава 3 сейчас.

sniper21 ★★★★★
() автор топика
Последнее исправление: sniper21 (всего исправлений: 1)
Ответ на: комментарий от anonymous

Это, наверное, происходит... да, на аллокаторе, который не знает о нитях?

ptmalloc знает, но во-первых, начиная с некоторого момента, арен перестает хватать и несколько потоков начинают «сидеть» на одной арене (не уверен насчет fastbin-ов).

Во-вторых, операция выделения памяти хоть и быстрая, но не мгновенная.

В-третьих, std::string(argv[i]) == "somestr" даже длиннее, чем strcmp(argv[i], "somestr") == 0 и делает больше ненужных действий!

В-четвертых, тот товарищ кастовал argv[i] к std::string трижды внутри одного цикла.

В сухом остатке: зачем давать такие вредные советы новичку?

kawaii_neko ★★★★
()
Последнее исправление: kawaii_neko (всего исправлений: 1)
Ответ на: комментарий от kawaii_neko

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

ptmalloc знает, но во-первых, начиная с некоторого момента, арен перестает хватать

Его арены такие маленькие, что исчерпываются описанными выше аллокациями? Беда.

Во-вторых, операция выделения памяти хоть и быстрая, но не мгновенная.

Любая операция в цикле до argc - дешевая.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от Dudraug

Он не прав и делает из мухи слона, когда ему об этом сказали он перешел на личности. Но к делу маленький эксперимент

#include <iostream>
#include <string>
#include <limits>

int main(int argc,char **argv){
  unsigned long long i{},c{};
  auto max=std::numeric_limits<unsigned long long>().max();
  auto min=std::numeric_limits<unsigned long long>().min();
  while(true){
    std::cout<<"cicle count# "<<std::string(std::to_string(c))<<"alloc count 2x "<<std::string(std::to_string(i))<<std::endl;
    ++i;
    if(i==max){
      ++c;
      i=min;
    }
  }
  return 0;
}
Надеюсь не будешь спорить, что данный кусок индокода, совершает как минимум 2 алокации и 2 делокации за цикл, и симулирует выше описанный пример. Согласно мнению, данный код должен исчерпать heap и программа должна упасть. Прождав час 30 я не дождался падения, кроме того даже память не течет.
cicle count# 0alloc count 2x 3863335853
cicle count# 0alloc count 2x 3863335854
cicle count# 0alloc count 2x 3863335855
cicle count# 0alloc count 2x 3863335856
cicle count# 0alloc count 2x 3863335857
cicle count# 0alloc count 2x 3863335858
cicle count# 0alloc count 2x 3863335859
^C
./test  2039,92s user 3623,08s system 98% cpu 1:36:07,33 total

Silerus ★★★★
()
Ответ на: комментарий от Silerus

Согласно мнению, данный код должен исчерпать heap и программа должна упасть

Мне кажется, ты наркоман. Прописываю тебе glibc-2.25/malloc/malloc.c до просветления помутненного рассудка.

Заодно перечитай, что я отвечал анонимусу тут.

kawaii_neko ★★★★
()
Ответ на: комментарий от Silerus

кроме того даже память не течет.

А какого лешего она вообще течь должна? Даже в теории. И с чего бы прога должна упасть? Ты втираешь мне какую-то дичь.

Dudraug ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.