Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Гаряка Асмик
Статус: Профессор
Рейтинг: 4981
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2523
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2010
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1586
Дата выхода:03.11.2010, 19:00
Администратор рассылки:Verena (Профессионал)
Подписчиков / экспертов:337 / 174
Вопросов / ответов:2 / 4

Вопрос № 180480: Уважаемые эксперты! У меня вопрос такого плана. Пользователь запускает программу, указав числовой параметр в командной строке: prog.exe 123 Программа prog.exe должна получить этот параметр, присоединить к строке и вывести значение перемен...


Вопрос № 180492: Здравствуйте, уважаемые эксперты! В продолжение вопроса №180480 о слиянии строк в C++. Кое что начинает проясняться, но хотелось бы посмотреть реализацию следующего алгоритма на С++....

Вопрос № 180480:

Уважаемые эксперты!
У меня вопрос такого плана.
Пользователь запускает программу, указав числовой параметр в командной строке:
prog.exe 123
Программа prog.exe должна получить этот параметр, присоединить к строке и вывести значение переменной на экран. Примерно так:
str="Вы указали число: " $argv[1];
print str;

Вопросы такие:
1. Какой на ваш взгляд самый оптимальный способ вывести это экран?
2. Приведите пример реализации этого на C++.
3. Какой тип лучше всего подходит для переменной str?

Благодарю!

Отправлен: 28.10.2010, 20:17
Вопрос задал: Калашников О.А. (Руководитель)
Всего ответов: 2
Страница вопроса »


Отвечает Гаряка Асмик (Профессор) :
Здравствуйте, Калашников О.А.!

Лучше всего использовать string из stl.
Код:


#include <iostream>
#include <string>
using namespace std;

int main(int argc, char* argv[])
{
string str="Your parameter was ";
if(argc>1)
{
str+=argv[1];
cout <<str;
}
return 0;
}

-----
Я ни от чего, ни от кого не завишу.

Ответ отправил: Гаряка Асмик (Профессор)
Ответ отправлен: 28.10.2010, 20:28
Номер ответа: 263711

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 263711 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Ответ поддержали (отметили как правильный): 1 чел.



    Отвечает Micren (Профессионал) :
    Здравствуйте, Калашников О.А.!
    Программа. Компилировал gcc.
    Код:
    /* 
    * File: main.cpp
    * Author: Micren
    *
    * Created on 28 Октябрь 2010 г., 19:23
    */

    #include <iostream>
    #include <string>

    /*
    *
    */
    int main(int argc, char** argv)
    {
    std::string str = "Вы указали число:";
    while (*++argv)
    {
    str = str + ' ' + *argv;
    }
    std::cout << str << std::endl;
    return 0;
    }

    Пример работы:
    Код:
    ~/NetBeansProjects/180480/dist/Debug/GNU-Linux-x86> ./180480 123 456 Вася:\)
    Вы указали число: 123 456 Вася:)

    Ответ отправил: Micren (Профессионал)
    Ответ отправлен: 28.10.2010, 20:31
    Номер ответа: 263712

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 263712 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Вопрос № 180492:

    Здравствуйте, уважаемые эксперты!
    В продолжение вопроса №180480 о слиянии строк в C++.
    Кое что начинает проясняться, но хотелось бы посмотреть реализацию следующего алгоритма на С++.

    1. Выделяем память оператором new для последующего размещения в ней строки не более 100 байт.
    2. Заносим в эту память строку "Ваше число: "
    3. Добавляем к этой строке целое число из переменной типа int
    4. Вызываем функцию с полученной строкой, которая в качестве аргумента принимает const char *string

    Например, на Перле я бы организовал это так:
    $a=10;
    $str="Ваше число: $a";
    func($str);

    Вот как-то так.

    Отправлен: 29.10.2010, 19:50
    Вопрос задал: Калашников О.А. (Руководитель)
    Всего ответов: 2
    Страница вопроса »


    Отвечает Гаряка Асмик (Профессор) :
    Здравствуйте, Калашников О.А.!

    Типа const char *string не бывает. Можно использовать const char *, а можно string, который является частью библиотеки STL и подключается с помощью #include <string>. В VS можно подключить MFC и использовать класс CString, в .Net Managed C++ тоже есть класс, аналогичный такому же в С#. Строковые литералы имеют тип const char *.


    Подход, типичный для чистого C
    Код:

    int a=10;
    char* buf=malloc(100);
    sprintf(buf,"vashe chislo=%d",a);
    printf(buf);
    free(buf);
    return 0;

    Если взять оператор new из С++, но старые средства вывода, получится
    Код:

    #include <stdlib.h>
    #include <stdio.h>
    void func(const char * str)
    {
    }

    int main(int argc, char* argv[])
    {
    int a=10;
    char* buf=new char[100];
    sprintf(buf,"vashe chislo=%d",a);
    printf(buf);
    delete[] buf;
    return 0;
    }

    buf константой объявлять нельзя, потому что sprintf меняет строку, и программа не компилируется. Но ее можно передать в func. Обратный случай невозможен.

    В STL строка является шаблоном basic_string, имеющим специализации string и wstring. Второй можно использовать для юникода.
    В качестве параметра конструктора string может выступать строковый литерал. string имеет то преимущество, что STL сама занимается пробле мами выделения и освобождения памяти.



    -----
    Я ни от чего, ни от кого не завишу.

    Ответ отправил: Гаряка Асмик (Профессор)
    Ответ отправлен: 29.10.2010, 20:14
    Номер ответа: 263726

    Оценка ответа: 5
    Комментарий к оценке:
    Благодарю! Подробное и профессиональое решение!

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 263726 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Отвечает Micren (Профессионал) :
    Здравствуйте, Калашников О.А.!
    К предыдущему решению могу добавить еще одно. Без оператора new и в чисто C++ стиле. Кроме того, если используете компиляторы от MS и Borland, можете попробовать нестандартную ф-ю itoa(). Либо написать собственную ф-ю преобразования, что не сложно.
    Код:
    /* 
    * File: main.cpp
    * Author: Micren
    *
    * Created on 29 Октябрь 2010 г., 19:08
    */
    #include <iostream>
    #include <sstream>
    #include <cstring>
    #include <cstdio>

    /*
    *
    */
    const size_t STR_SIZE = 100;

    void func(const char* const str)
    {
    std::cout << str << std::endl;
    }

    void func(const std::string& str)
    {
    std::cout << str << std::endl;
    }

    int main(int argc, char** argv)
    {
    int a = 10;

    // 1й вариант
    std::stringstream sstream;
    sstream << "Ваше число: " << a;
    func(sstream.str());

    // 2й вариант
    try
    {
    char* str = new char[STR_SIZE];
    strcpy(str, "Ваше число: ");
    sprintf(str, "%s%i", str, a);
    func(str);
    delete[] str;
    }
    catch (std::bad_alloc)
    {
    std::cerr << "Не могу выделить память" << std::endl;
    return 1;
    }

    return 0;
    }

    Вывод программы:
    Код:
    Ваше число: 10
    Ваше число: 10

    Ответ отправил: Micren (Профессионал)
    Ответ отправлен: 29.10.2010, 20:34
    Номер ответа: 263727

    Оценка ответа: 5
    Комментарий к оценке:
    Благодарю! Подробное и профессиональое решение!

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 263727 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFPRO.RU, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.22 от 02.11.2010

    В избранное