Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 173
1

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

11.05.2014, 18:04. Просмотров 838. Ответов 14
Метки нет (Все метки)

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 объединенную текстовую строку "Значение переменной: "+ее_значение?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2014, 18:04
Ответы с готовыми решениями:

Объявление C-строки для передачи в функцию
void Button3_Click(void) { char str = &quot;asDf123_демобилизаЦияЖж:;&quot;; //char*...

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

Функция вне класса для передачи функции объекта
Добрый вечер, уважаемые форумчане. Столкнулся с таким пунктом в условии...

Выведение соообщения,что точка находится границе
Задача следующая: Определить, попадает ли точка с заданными координатами в...

Написать программу с использованием функции, которая сравнивает две строки, заданные в качестве её аргументов
Написать программу с использованием функции, которая сравнивает две строки,...

14
zss
Модератор
Эксперт С++
7178 / 6677 / 4226
Регистрация: 18.12.2011
Сообщений: 17,621
Завершенные тесты: 1
11.05.2014, 19:06 2
C++
1
 sprintf(str, "Значение переменной: %.16g", dbl );
1
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
11.05.2014, 19:31 3
Цитата Сообщение от Dimmak Посмотреть сообщение
C++
1
char* str = new char[20];
Динамическое выделение памяти тут ни к чему, к тому же размер не достаточен для записи результата.
Почему бы не использовать std::string?
0
Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 173
11.05.2014, 20:14  [ТС] 4
Цитата Сообщение от Tulosba Посмотреть сообщение
Динамическое выделение памяти тут ни к чему, к тому же размер не достаточен для записи результата.
Почему бы не использовать std::string?
Когда я опробовал несколько стандартных методов объединения строк, то функция MessageBoxA отказалась от них ошибкой. Но код, предложенный zss работает даже в случае:
C++
1
char* str = new char[1];
Подскажите еще, пожалуйста, как в MessageBoxA вывести несколько строк колонкой( чтобы в каждой из колонок находилось по одному конвертированному double>>string ).
0
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
11.05.2014, 20:17 5
Цитата Сообщение от Dimmak Посмотреть сообщение
Когда я опробовал несколько стандартных методов объединения строк, то функция MessageBoxA отказалась от них ошибкой.
Можете продемонстрировать эти методы здесь?
Цитата Сообщение от Dimmak Посмотреть сообщение
работает даже в случае
Если что-то работает прямо сейчас и у Вас, это не значит, что будет работать у других и потом, когда кода станет больше. В данном случае происходит запись за границы выделенной памяти, а это в любом случае - ошибка. Размер выделенной памяти под строку должен быть не меньше размера строки, которая будет в эту память записана (не забудьте еще про завершающий нуль-символ).
Цитата Сообщение от Dimmak Посмотреть сообщение
как в MessageBoxA вывести несколько строк колонкой.
Попробуйте разделять слова через '\n', но не факт, что это будет работать. Пример:
C++
1
const char* str = "first line\nsecond line\nthird line";
0
Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 173
11.05.2014, 20:26  [ТС] 6
Цитата Сообщение от Tulosba Посмотреть сообщение
Если что-то работает прямо сейчас и у Вас, это не значит, что будет работать у других и потом, когда кода станет больше. В данном случае происходит запись за границы выделенной памяти, а это в любом случае - ошибка. Размер выделенной памяти под строку должен быть не меньше размера строки, которая будет в эту память записана (не забудьте еще про завершающий нуль-символ).
Спасибо за информацию. Буду в курсе. После ruby, c++ воспринимается мной как джунгли...
Цитата Сообщение от Tulosba Посмотреть сообщение
Попробуйте разделять слова через '\n', но не факт, что это будет работать.
Подскажите , пожалуйста, как в MessageBoxA вывести несколько строк колонкой( чтобы в каждой из строк находилось по одному конвертированному double>>string ). Те:
1_строка)"Значение 1ой переменной: "+ее_значение
2_строка)"Значение 2ой переменной: "+ее_значение
0
zss
Модератор
Эксперт С++
7178 / 6677 / 4226
Регистрация: 18.12.2011
Сообщений: 17,621
Завершенные тесты: 1
11.05.2014, 20:46 7
Лучший ответ Сообщение было отмечено Dimmak как решение

Решение

C++
1
sprintf(str, "Значение 1ой переменной: %.16g\nЗначение 2ой переменной: %.16g", dbl1,dbl2 );
0
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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'
0
Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 173
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.
0
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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 ); // добавляем в кучу
1
Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 173
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;
}
0
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
14.05.2014, 21:15 12
Цитата Сообщение от Dimmak Посмотреть сообщение
я все правильно сделал?
Не правильно.
Как я уже говорил раньше, памяти должно быть выделено достаточно для строки, а у Вас строка, формируемая в sprintf будет иметь длину больше 20 символов.
Динамическая память тут вообще не нужна, но если уж используете, что не помешает и освобождение через delete[].
Для sprintf и strcat нужно включить <cstdio> и <cstring> соответственно. А <iostream> тут не нужен.
0
Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 173
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 *'
0
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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];
И никаких ошибок быть не должно.
1
Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 173
14.05.2014, 23:07  [ТС] 15
Да, действительно все OK! Видимо где-то очепятался...
Спасибо Tulosba за Вашу помощь!
0
14.05.2014, 23:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2014, 23:07

Как сравнить две строки?
Написал программу но не проходит сравнение вот это сравнение: bool...

Как привести тип параметра для передачи в функцию массивов
Господа! Помогите, пожалуйста!!! Никак не могу передать в функцию...

Как снять константность ссылки для передачи в функцию адреса
Здравствуйте. Есть функция с сигнатурой: void func(const tm &amp; _tm); В теле...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru