LINUX.ORG.RU

Преобразование string в const char [C++]

 


0

3

И так есть код:точнее его кусочек писанный на C++

                cout << "Enter Path of downloaded JRE or JDK: " ;
                string JrePath;
                cin >>JrePath;
                system("update-alternatives --install /usr/bin/java java " << JrePath.c_str() << " 3");
                system("update-alternatives --configure java");
                if (boost::filesystem::exists("/usr/bin/java/bin/java") == 0)
                {
                    cout << "Java hasn't configured! Path /usr/bin/java/bin/java hasn't exists" << endl;
                    cout << "Enter Command: ";
                    cin >> a; 
                }
При компиляции получаю вот что -
main.cpp:36: error: invalid operands of types ‘const char [50]’ and ‘const char*’ to binary ‘operator<<’
main.cpp:49: error: jump to case label
main.cpp:34: error:   crosses initialization of ‘std::string JrePath’
main.cpp:54: error: jump to case label
main.cpp:34: error:   crosses initialization of ‘std::string JrePath’
main.cpp:27: warning: ignoring return value of ‘int system(const char*)’, declared with attribute warn_unused_result
main.cpp:37: warning: ignoring return value of ‘int system(const char*)’, declared with attribute warn_unused_result
main.cpp:55: warning: ignoring return value of ‘int system(const char*)’, declared with attribute warn_unused_result

Много каких решений перепробовал, ничего не помогает. Прошу помощи.


Полный код с номерами строк в студию. Похоже, ошибка где-то в другом месте.

if (boost::filesystem::exists(«/usr/bin/java/bin/java») == 0)\

Не проще ли if (!boost::filesystem::exists(«/usr/bin/java/bin/java»))

dmfd
()

invalid operands of types ‘const char [50]’ and ‘const char*’ to binary ‘operator<<’

Я солидарен с компилятором.

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

Ах ты, чёрт, проглядел:

system(«update-alternatives --install /usr/bin/java java » << JrePath.c_str() << " 3");

Нужно, вероятно, заменить на system(«update-alternatives --install /usr/bin/java java » + JrePath.c_str() + " 3");

dmfd
()

Ты пытаешься применить операцию вывода в поток с Сишными строками. Тебе надо сделать эту операцию с stl-строками, а потом уже результат преобразовать в char*.

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

Вернее так:

system((«update-alternatives --install /usr/bin/java java » + JrePath + " 3").c_str());

Не знаю, что эта функция жрёт, std::string или c string.

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

так в том то и дело чт сначала так все и было там + стояли у меня! и все равно та же ошибка! это я решение на каком то сайте наше и попробовал, эффект тот же. Вот собсно 'код'

#include <iostream>
#include <boost/filesystem.hpp>
#include <string>

using namespace std;
using system;

int main()
{
    int a;
    cout << "1 - Configure Java" << endl << "2 - Download Java" << endl << "3 - Exit" << endl << "4 - Exit" << endl;
    cout << "Enter number of command: ";
    cin >> a;
    while(100000)
    {
        switch(a)
        {
            case 1:
                cout << "Enter Path of downloaded JRE or JDK: " ;
                string JrePath;
                cin >>JrePath;
                system("update-alternatives --install /usr/bin/java java " << JrePath.c_str() << " 3");
                system("update-alternatives --configure java");
                if (boost::filesystem::exists("/usr/bin/java/bin/java") == 0)
                {
                    cout << "Java hasn't configured! Path /usr/bin/java/bin/java hasn't exists" << endl;
                    cout << "Enter Command: ";
                    cin >> a; 
                }
                else
                {cout << "Java Succsesfully configurated! And ready to start programs who use JavaVM!" << endl;}
                cout << "Enter number of command: ";
                cin >> a;
                break;
            case 2:
                cout << "This function unsupported now!" << endl;
                cout << "Enter number of command: ";
                cin >> a;
                break;
            case 3:
                system("exit");
        }
    }
    return 0;
}

vikt3r
() автор топика
Ответ на: комментарий от O02eg

Вот не люблю я поэтому вместе с кем-то работать. Вроде считаешь человека приличным, пробегаешь код по-диагонали, а там такое.

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

«update-alternatives --install /usr/bin/java java » << JrePath.c_str() << " 3"

В любом случае, константная строка не понимает операторов «+», «<<» и т.д. Это не JS. Чтобы использовать перегруженный оператор слева должен стоять объект в котором он описан, коего нет в обычной строке. Как решение, заведи временный буфер, куда добавь «update-alternatives --install /usr/bin/java java », затем JrePath в правильной форме, затем " 3"

string buf="update-alternatives --install /usr/bin/java java ";
buf += JrePath;
buf += " 3";
Далее можно упрощаешь и конвертишь во что нужно.

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

using system;

Эээ, что?!

И да, отрефакторил немного и пофиксил некоторые ошибки:

#include <iostream>
#include <boost/filesystem.hpp>
#include <string>
#include <stdlib.h>

using namespace std;

int main()
{
    cout << "1 - Configure Java" << endl << "2 - Download Java" << endl << "3 - Exit" << endl;
    for(;;)
    {
        int a;
        cout << "Enter number of command: ";
        cin >> a;
        switch(a)
        {
            case 1:
                cout << "Enter Path of downloaded JRE or JDK: " ;
                string JrePath;
                cin >>JrePath;
                system("update-alternatives --install /usr/bin/java java " << JrePath.c_str() << " 3");
                system("update-alternatives --configure java");
                if (!boost::filesystem::exists("/usr/bin/java/bin/java"))
                {
                    cout << "Java hasn't configured! Path /usr/bin/java/bin/java hasn't exists" << endl;
                }
                else
                {
                    cout << "Java Succsesfully configurated! And ready to start programs who use JavaVM!" << endl;
                }
                break;
            case 2:
                cout << "This function unsupported now!" << endl;
                break;
            case 3:
                return 0;
        }
    }
}

Исправил system(«exit»), который ничего не делает; двойной запрос следующей команды в case 1; вынес повторяющийся код; добавил stdlib.h; исправил using system.

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

Я даже не стану спрашивать, компилируется ли это.

Я даже не пробовал это компилировать, я просто исправил самую очевидную фигню, которую я заметил, чтобы избежать ещё миллиона вопросов ТСа о том, почему его говнокод не работает. Кстати, это лучше было вообще на баше переписать.

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

Вот это компилится

#include <iostream>
#include <boost/filesystem.hpp>
#include <string>
#include <stdlib.h>

using namespace std;

int main()
{
    cout << "1 - Configure Java" << endl << "2 - Download Java" << endl << "3 - Exit" << endl;
    for(;;)
    {
        int a;
        cout << "Enter number of command: ";
        cin >> a;
        switch(a)
        {
            case 1: {
                cout << "Enter Path of downloaded JRE or JDK: " ;
                string JrePath;
                cin >> JrePath;
                system(("update-alternatives --install /usr/bin/java java " + JrePath + " 3").c_str());
                system("update-alternatives --configure java");
                if (!boost::filesystem::exists("/usr/bin/java/bin/java"))
                {
                    cout << "Java hasn't configured! Path /usr/bin/java/bin/java hasn't exists" << endl;
                }
                else
                {
                    cout << "Java Succsesfully configurated! And ready to start programs who use JavaVM!" << endl;
                }
                break;
		}
            case 2:
                cout << "This function unsupported now!" << endl;
                break;
            case 3:
                return 0;
        }
    }
}
gentoo_root ★★★★★
()
Ответ на: комментарий от vazgen05

Оставил ту же ошибку что и у ОП'а — объявление переменной в case-блоке.

Нет там этой ошибки, смотри внимательнее, там скобочки.

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

Последний мой вариант точно работает. Я его даже от начала до конца прочитал.

dmfd
()

Ты обрати внимание на то что там 2 и 3 вервия сейчас в бусте, с 1.48 они переехали на 3, так что если код старый нужно задефайнить Фс2

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

Мой говнокод? Тогда что ж ты исправил на 1ый вариант того самого кода?! УМНИК! Генту_рут И using system я нечаянно не знаю даже зачем сунул, когда stdlib заносит system

vikt3r
() автор топика

Блин, только сейчас дошло. Люди языка не знают, а уже буст тащат.

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

Мой говнокод?

Ну не мой же.

Тогда что ж ты исправил на 1ый вариант того самого кода?!

Яничегонепонял.

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

gentoo_root ★★★★★
()

Используй sprintf и будет тебе счастье. Все варианты с этими << >> + += для строк - это редкостное убожество. Я не знаю, что курил тот кто это придумал, но оно явно очень забористое. Больше всего мне не ясно, не ужели было сложно написать в классе string метод format(), как в CString из MFC.

invy ★★★★★
()
Ответ на: комментарий от invy
#include <sstream>

// ...

    ostringstream cmd;

    cmd << "update-alternatives --install /usr/bin/java java " << JrePath << " 3";
    system(cmd);

    cmd << "update-alternatives --configure java";
    system(cmd);

// ...

void system(ostringstream& stream)
{
    std::system(stream.str().c_str());

    // Clearing the contents of the stream
    stream.str("");
}

ostringstream не так уж и плох. Но QString(«command --opt %2 --file %1 »).arg(opt).arg(file) чуть лучше в этом случае, именения порядка с << весьма болезненный.

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

пардон

#include <sstream>

// ...

    ostringstream cmd;

    cmd << "update-alternatives --install /usr/bin/java java " << JrePath << " 3";
    system(cmd);

    cmd << "update-alternatives --configure java";
    system(cmd);

// ...

void system(ostringstream& stream)
{
    std::system(stream.str().c_str());

    // Clearing the contents of the stream
    stream.str("");
}

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

И нехрена не компилится! И этой тонны ошибок не было вначале когда я только увидел на экране fail при компиляции. А потом уже велосипеды начал лепить ненужные. 002eg иди отсюда жирный троль.

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

И нехрена не компилится!

У меня компилится. Собирал так:

g++ test.cpp -o test -lboost_filesystem

Подозреваю, что ты забыл слинковаться с бустом. O02eg таки прав.

И этой тонны ошибок не было вначале когда я только увидел на экране fail при компиляции.

Да ну? А когда они по-твоему появились?

А потом уже велосипеды начал лепить ненужные.

ССЗБ.

002eg иди отсюда жирный троль.

А ему это сказать ты побоялся?

gentoo_root ★★★★★
()
Ответ на: комментарий от vikt3r
// main.cpp
#include <iostream>
#include <sstream>
#include <string>
#include <limits>
#include <cstdlib>

#include <boost/filesystem.hpp>

#include "main.hpp"

using namespace std;

int main( int argc, const char *argv[] )
{
    bool quit = false;
    while( !quit )
    {
        cout << "Nice prompt" << endl;
        cout << "1 - Configure Java" << endl;
        cout << "2 - Download Java" << endl;
        cout << "3 - Exit" << endl;

        int cmdNumber;
        cout << "Enter number of command: ";
        cin >> cmdNumber;

        if( cin.eof() )
        {
            quit = true;
            break;
        } else if( cin.fail() ) {
            cout << "Not a number. Try again.\n" << endl;
            // clearing buffer
            cin.clear();
            cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );

            continue;
        }

        switch( cmdNumber )
        {
        case 1:
            configure();
            break;

        case 2:
            download();
            break;

        case 3:
            // Exit code
            quit = true;
            break;

        default:
            cerr << "Unknown command: " << cmdNumber << endl;
            break;
        }
        cout << endl;
    }
}

bool configure( void )
{
    string JrePath;
    cout << "Enter Path of downloaded JRE or JDK: ";
    cin >> JrePath;

    ostringstream cmd;

    cmd << "update-alternatives --install /usr/bin/java java " << JrePath << " 3";
    system(cmd);

    cmd << "update-alternatives --configure java";
    system(cmd);

    if( !boost::filesystem::exists("/usr/bin/java/bin/java") )
    {
        cout << "Java hasn't configured! Path /usr/bin/java/bin/java hasn't exists" << endl;
    } else {
        cout << "Java Succsesfully configurated! And ready to start programs who use JavaVM!" << endl;
    }
}

bool download( void )
{
    cout << "This function unsupported now!" << endl;
}

void system( ostringstream& stream )
{
    std::system( stream.str().c_str() );

    // Clearing the contents of the stream
    stream.str( "" );
}
// main.hpp
#ifndef MAIN_HPP
#define MAIN_HPP

#include <sstream>

bool configure(void);
bool download(void);

void system(std::ostringstream& stream);

#endif
cmake_minimum_required(VERSION 2.8)
project(javainst)

find_package(Boost COMPONENTS system filesystem REQUIRED)

add_definitions(-std=c++11 -pedantic)
add_executable(javainst main.cpp)

target_link_libraries(javainst
  ${Boost_FILESYSTEM_LIBRARY}
  ${Boost_SYSTEM_LIBRARY}
)

А по морде вломить тебе прописать все таки следует.

Буду признателен, если знатоки найдут ошибки.

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