Форум программистов, компьютерный форум CyberForum.ru

Как объединенить две строки для передачи функции соообщения? - C++

Восстановить пароль Регистрация
 
Dimmak
 Аватар для Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 170
11.05.2014, 18:04     Как объединенить две строки для передачи функции соообщения? #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "stdafx.h"
#include <windows.h>
//#include <iostream>
//using namespace std;
 
int main() {
        char* str = new char[20];
           double dbl = 1.1234123412341234;
                sprintf(str, "%.16g", dbl );    
    MessageBoxA( NULL, str, "Сообщение:", MB_OK );
return 0;
}
Как передать функции MessageBoxA объединенную текстовую строку "Значение переменной: "+ее_значение?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2014, 18:04     Как объединенить две строки для передачи функции соообщения?
Посмотрите здесь:

C++ Две функции для работы с массивом
Написать текст функции strcat(), "склеивающей" две текстовые строки C++
C++ Написать программу с использованием функции, которая сравнивает две строки, заданные в качестве её аргументов
Как обьединить две функции в одну? C++
Подскажите как параллельно запустить две функции в C++? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1787
Регистрация: 18.12.2011
Сообщений: 14,196
Завершенные тесты: 1
11.05.2014, 19:06     Как объединенить две строки для передачи функции соообщения? #2
C++
1
 sprintf(str, "Значение переменной: %.16g", dbl );
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
11.05.2014, 19:31     Как объединенить две строки для передачи функции соообщения? #3
Цитата Сообщение от Dimmak Посмотреть сообщение
C++
1
char* str = new char[20];
Динамическое выделение памяти тут ни к чему, к тому же размер не достаточен для записи результата.
Почему бы не использовать std::string?
Dimmak
 Аватар для Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 170
11.05.2014, 20:14  [ТС]     Как объединенить две строки для передачи функции соообщения? #4
Цитата Сообщение от Tulosba Посмотреть сообщение
Динамическое выделение памяти тут ни к чему, к тому же размер не достаточен для записи результата.
Почему бы не использовать std::string?
Когда я опробовал несколько стандартных методов объединения строк, то функция MessageBoxA отказалась от них ошибкой. Но код, предложенный zss работает даже в случае:
C++
1
char* str = new char[1];
Подскажите еще, пожалуйста, как в MessageBoxA вывести несколько строк колонкой( чтобы в каждой из колонок находилось по одному конвертированному double>>string ).
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
11.05.2014, 20:17     Как объединенить две строки для передачи функции соообщения? #5
Цитата Сообщение от Dimmak Посмотреть сообщение
Когда я опробовал несколько стандартных методов объединения строк, то функция MessageBoxA отказалась от них ошибкой.
Можете продемонстрировать эти методы здесь?
Цитата Сообщение от Dimmak Посмотреть сообщение
работает даже в случае
Если что-то работает прямо сейчас и у Вас, это не значит, что будет работать у других и потом, когда кода станет больше. В данном случае происходит запись за границы выделенной памяти, а это в любом случае - ошибка. Размер выделенной памяти под строку должен быть не меньше размера строки, которая будет в эту память записана (не забудьте еще про завершающий нуль-символ).
Цитата Сообщение от Dimmak Посмотреть сообщение
как в MessageBoxA вывести несколько строк колонкой.
Попробуйте разделять слова через '\n', но не факт, что это будет работать. Пример:
C++
1
const char* str = "first line\nsecond line\nthird line";
Dimmak
 Аватар для Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 170
11.05.2014, 20:26  [ТС]     Как объединенить две строки для передачи функции соообщения? #6
Цитата Сообщение от Tulosba Посмотреть сообщение
Если что-то работает прямо сейчас и у Вас, это не значит, что будет работать у других и потом, когда кода станет больше. В данном случае происходит запись за границы выделенной памяти, а это в любом случае - ошибка. Размер выделенной памяти под строку должен быть не меньше размера строки, которая будет в эту память записана (не забудьте еще про завершающий нуль-символ).
Спасибо за информацию. Буду в курсе. После ruby, c++ воспринимается мной как джунгли...
Цитата Сообщение от Tulosba Посмотреть сообщение
Попробуйте разделять слова через '\n', но не факт, что это будет работать.
Подскажите , пожалуйста, как в MessageBoxA вывести несколько строк колонкой( чтобы в каждой из строк находилось по одному конвертированному double>>string ). Те:
1_строка)"Значение 1ой переменной: "+ее_значение
2_строка)"Значение 2ой переменной: "+ее_значение
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1787
Регистрация: 18.12.2011
Сообщений: 14,196
Завершенные тесты: 1
11.05.2014, 20:46     Как объединенить две строки для передачи функции соообщения? #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
sprintf(str, "Значение 1ой переменной: %.16g\nЗначение 2ой переменной: %.16g", dbl1,dbl2 );
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
11.05.2014, 23:56     Как объединенить две строки для передачи функции соообщения? #8
Цитата Сообщение от Dimmak Посмотреть сообщение
вывести несколько строк колонкой
В общем случае лучше использовать цикл:
C++
1
2
3
4
5
6
*str = 0;
for( int i = 0; i<num; ++i ) 
{
   strcat( str, "Значение %d-й переменной: %.16g\n", i, dbl[i] );
}
str[strlen[str]-1] = 0; // убираем последний '\n'
Dimmak
 Аватар для Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 170
14.05.2014, 18:45  [ТС]     Как объединенить две строки для передачи функции соообщения? #9
Цитата Сообщение от Tulosba Посмотреть сообщение
В общем случае лучше использовать цикл:

C++
1
2
3
4
5
6
*str = 0;
for( int i = 0; i<num; ++i ) 
{
 strcat( str, "Значение %d-й переменной: %.16g\n", i, dbl[i] );
}
str[strlen[str]-1] = 0; // убираем последний '\n'
Выпадет с ошибками: 'strcat' : function does not take 4 parameters и тд.
Предоставьте, пожалуйста, рабочий код цикла, если это возможно, для MessageBoxA.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.05.2014, 19:06     Как объединенить две строки для передачи функции соообщения? #10
Цитата Сообщение от Dimmak Посмотреть сообщение
Выпадет с ошибками: 'strcat' : function does not take 4 parameters и тд.
Ну да. Что-то я совместил strcat и sprintf Вот такое должно быть тело цикла:
C++
1
2
3
char line[100];
sprintf( line, "Значение %d-й переменной: %.16g\n", i, dbl[i] ); // формируем строку
strcat( str, line ); // добавляем в кучу
Dimmak
 Аватар для Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 170
14.05.2014, 20:19  [ТС]     Как объединенить две строки для передачи функции соообщения? #11
Спасибо. Вот рабочий код, я все правильно сделал?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;
 
int main() {
 
    int const N= 5;
    double aNum[N]= {1,2,3,4,5}; 
        char* line = new char[200];
            *line= 0;
            char* str = new char[20];
        
        for( int i= 0; i<N; ++i ) {
            sprintf( str, "Значение %d-й переменной: %.16g\n", i, aNum[i] );
            strcat( line, str );
        }
    MessageBoxA( NULL, line, "Сообщение:", MB_OK );
 
return 0;
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.05.2014, 21:15     Как объединенить две строки для передачи функции соообщения? #12
Цитата Сообщение от Dimmak Посмотреть сообщение
я все правильно сделал?
Не правильно.
Как я уже говорил раньше, памяти должно быть выделено достаточно для строки, а у Вас строка, формируемая в sprintf будет иметь длину больше 20 символов.
Динамическая память тут вообще не нужна, но если уж используете, что не помешает и освобождение через delete[].
Для sprintf и strcat нужно включить <cstdio> и <cstring> соответственно. А <iostream> тут не нужен.
Dimmak
 Аватар для Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 170
14.05.2014, 22:19  [ТС]     Как объединенить две строки для передачи функции соообщения? #13
Цитата Сообщение от Tulosba Посмотреть сообщение
Для sprintf и strcat нужно включить <cstdio> и <cstring> соответственно. А <iostream> тут не нужен.
Согласен, принято.
Цитата Сообщение от Tulosba Посмотреть сообщение
Как я уже говорил раньше, памяти должно быть выделено достаточно для строки, а у Вас строка, формируемая в sprintf будет иметь длину больше 20 символов.
Ошибка из разряда копи-паст. Исправил.
Цитата Сообщение от Tulosba Посмотреть сообщение
Динамическая память тут вообще не нужна, но если уж используете, что не помешает и освобождение через delete[].
Иначе такая ошибка: 'MessageBoxA' : cannot convert parameter 2 from 'char' to 'const char *'
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.05.2014, 22:27     Как объединенить две строки для передачи функции соообщения? #14
Цитата Сообщение от Dimmak Посмотреть сообщение
Иначе такая ошибка: 'MessageBoxA' : cannot convert parameter 2 from 'char' to 'const char *'
Что-то не так пишете значит.
C++
1
2
char line[200] = {0};
char str[100];
И никаких ошибок быть не должно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2014, 23:07     Как объединенить две строки для передачи функции соообщения?
Еще ссылки по теме:

C++ Функция вне класса для передачи функции объекта
C++ Необходимо написать две функции для вычисления площади прямоугольника и круга
Как сравнить две строки? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Dimmak
 Аватар для Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 170
14.05.2014, 23:07  [ТС]     Как объединенить две строки для передачи функции соообщения? #15
Да, действительно все OK! Видимо где-то очепятался...
Спасибо Tulosba за Вашу помощь!
Yandex
Объявления
14.05.2014, 23:07     Как объединенить две строки для передачи функции соообщения?
Ответ Создать тему
Опции темы

Текущее время: 14:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru