Вставка double в элемент массива char * - PullRequest
0 голосов
/ 24 февраля 2019

Как вставить двойной тип данных в массив char*?Я пытался использовать std::to_string(), а также c_str(), однако ни один из них не помог.

По сути, я пытаюсь вызвать программу на c ++, используя execvp(), которая при чтении справочной страницы Я думаю, что она должна принимать массив char*.

Я пытаюсь вызвать программу, а затем передать двойные значения a, b, and c в качестве параметров argv для программы, вызываемой execvp().

EG, когда a = 0.1, b =0.1, c = 0.1 execvp(args[0], args) должен сделать то же самое, что итерминальный вызов: ./RL 0.1 0.1 0.1

#include <iostream>
#include <unistd.h>
#include <stdlib.h>
#include <string>
int main()
{
    char *args[5];
    args[0] = "RL";
    std::string temp;
    for(double a = 0.1; a < 1; a += 0.1){
        for(double b = 0.1; b < 1; b += 0.1){
            for(double c = 0.1; c < 1; c+= 0.1){
                temp = std::to_string(a); //attempted to convert the double to a string
                args[1] = temp.c_str(); //attempted to convert the string to c string
                temp = std::to_string(b); 
                args[2] = temp; //attempted to just insert the string
                args[3] = c; //attempted to insert as double
                std::cout << "Calling: " << a << " " << b << " " << c << std::endl;
                execvp(args[0], args);
            }
        }
    }
    return 0;
}

Я получаю такие ошибки:

RLdriver.cpp:14:32: error: assigning to 'char *' from incompatible type 'const
      std::__1::basic_string<char, std::__1::char_traits<char>,
      std::__1::allocator<char> >::value_type *' (aka 'const char *')
                args[1] = temp.c_str();
                          ~~~~~^~~~~~~

RLdriver.cpp:16:27: error: assigning to 'char *' from incompatible type
      'std::string' (aka 'basic_string<char, char_traits<char>, allocator<char>
      >')
                args[2] = temp;
                          ^~~~

RLdriver.cpp:17:27: error: assigning to 'char *' from incompatible type 'double'
                args[3] = c;

РЕДАКТИРОВАТЬ: я знаю, exec() не будет работать в этом смысле цикла, как этозаменяет текущую программу, но я знаю, как с этим справиться позже, просто пытаясь заставить прохождение аргументов работать.

Ответы [ 3 ]

0 голосов
/ 24 февраля 2019

Ваш первый способ, т. Е.

temp = std::to_string(a); //attempted to convert the double to a string
args[1] = temp.c_str(); //attempted to convert the string to c string

, верен, за исключением того, что вам нужно изменить объявление char *args[5]; на const char *args[5];.Конечно, если вы хотите передать 3 разных аргумента командной строки, вам нужно 3 разных temp переменных (temp1, temp2, temp3).

0 голосов
/ 24 февраля 2019

С этим кодом есть две проблемы:

  • вы не можете заполнить свой "массив указателей на символы" args временными объектами при попытке, это не будет отражать то, что вам нужно,Вместо этого используйте (см. Ниже) const char* const args[] и заполните его указателями на реальные данные объекта tempa, tempb, tempc.

  • execvp ожидает char* const[], в то время как в C ++ вы всегда производите const char* const[], поэтому вам нужно привести что-то вроде execvp(const_cast<char* const*>(args));

Вы можете изменить свой код на, тогда он будет работать:

#include <iostream>
#include <unistd.h>
#include <stdlib.h>
#include <string>
int main()
{
    for(double a = 0.1; a < 1; a += 0.1){
        for(double b = 0.1; b < 1; b += 0.1){
            for(double c = 0.1; c < 1; c+= 0.1){
                std::string tempa = std::to_string(a); 
                std::string tempb = std::to_string(b); 
                std::string tempc = std::to_string(c);
                const char* const args[] = {tempa.c_str(), tempb.c_str(), tempc.c_str(), nullptr};
                std::cout << "Calling: " << a << " " << b << " " << c << std::endl;
                execvp(args[0], const_cast<char*const*>(args));
            }
        }
    }
    return 0;
}

(проверено)

0 голосов
/ 24 февраля 2019

Использование

args[1] = temp.c_str();

является проблемой, поскольку LHS относится к типу char*, а RHS относится к типу char const*.Вы не можете назначить char const* для char*.

. Простое исправление заключается в использовании:

args[1] = strdup(temp.c_str());

strdup не является стандартной библиотечной функцией, но некоторые компиляторы поддерживаютэто изначально.Если ваш компилятор не поддерживает его, это не так сложно реализовать самостоятельно.Найдите в Интернете, и вы, скорее всего, найдете его.

Убедитесь, что вы освободили строку, возвращаемую strdup.Вам нужно будет обратиться к документации вашего компилятора, чтобы выяснить, как выделяется память в strdup.Вам нужно будет использовать соответствующий механизм освобождения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...