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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 170
#1

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

11.05.2014, 18:04. Просмотров 300. Ответов 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++):

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

Выведение соообщения,что точка находится границе - C++
Задача следующая: Определить, попадает ли точка с заданными координатами в сектор радиуса R, расположенный вo IV четверти. (Уравнение...

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

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

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

Как сравнить две строки? - C++
Написал программу но не проходит сравнение вот это сравнение: bool flight_weight(char* flight) { if (predmet==flight) return...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zss
Модератор
Эксперт С++
6380 / 5945 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
11.05.2014, 19:06 #2
C++
1
 sprintf(str, "Значение переменной: %.16g", dbl );
1
Tulosba
:)
Эксперт С++
4395 / 3238 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
11.05.2014, 19:31 #3
Цитата Сообщение от Dimmak Посмотреть сообщение
C++
1
char* str = new char[20];
Динамическое выделение памяти тут ни к чему, к тому же размер не достаточен для записи результата.
Почему бы не использовать std::string?
0
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 ).
0
Tulosba
:)
Эксперт С++
4395 / 3238 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
Сообщений: 170
11.05.2014, 20:26  [ТС] #6
Цитата Сообщение от Tulosba Посмотреть сообщение
Если что-то работает прямо сейчас и у Вас, это не значит, что будет работать у других и потом, когда кода станет больше. В данном случае происходит запись за границы выделенной памяти, а это в любом случае - ошибка. Размер выделенной памяти под строку должен быть не меньше размера строки, которая будет в эту память записана (не забудьте еще про завершающий нуль-символ).
Спасибо за информацию. Буду в курсе. После ruby, c++ воспринимается мной как джунгли...
Цитата Сообщение от Tulosba Посмотреть сообщение
Попробуйте разделять слова через '\n', но не факт, что это будет работать.
Подскажите , пожалуйста, как в MessageBoxA вывести несколько строк колонкой( чтобы в каждой из строк находилось по одному конвертированному double>>string ). Те:
1_строка)"Значение 1ой переменной: "+ее_значение
2_строка)"Значение 2ой переменной: "+ее_значение
0
zss
Модератор
Эксперт С++
6380 / 5945 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
11.05.2014, 20:46 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
sprintf(str, "Значение 1ой переменной: %.16g\nЗначение 2ой переменной: %.16g", dbl1,dbl2 );
0
Tulosba
:)
Эксперт С++
4395 / 3238 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
Сообщений: 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.
0
Tulosba
:)
Эксперт С++
4395 / 3238 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
Сообщений: 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;
}
0
Tulosba
:)
Эксперт С++
4395 / 3238 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
14.05.2014, 21:15 #12
Цитата Сообщение от Dimmak Посмотреть сообщение
я все правильно сделал?
Не правильно.
Как я уже говорил раньше, памяти должно быть выделено достаточно для строки, а у Вас строка, формируемая в sprintf будет иметь длину больше 20 символов.
Динамическая память тут вообще не нужна, но если уж используете, что не помешает и освобождение через delete[].
Для sprintf и strcat нужно включить <cstdio> и <cstring> соответственно. А <iostream> тут не нужен.
0
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 *'
0
Tulosba
:)
Эксперт С++
4395 / 3238 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
Сообщений: 170
14.05.2014, 23:07  [ТС] #15
Да, действительно все OK! Видимо где-то очепятался...
Спасибо Tulosba за Вашу помощь!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2014, 23:07
Привет! Вот еще темы с ответами:

Написать текст функции strcat(), "склеивающей" две текстовые строки - C++
4. Написать текст функции strcat(), &quot;склеивающей&quot; две текстовые строки. Функция принимает указатели на две строки s1 и s2, выделяет память...

Как объединенить поля в MySQL - SQL Server
В общем есть таблица tab в ней есть поля 'nom' и поле 'nom2'. Их нужно вместе склеить или результат записать в новое поле. ...

Подготовка массива данных или строки для передачи в Serialport - C#
Привет ребята! Я не являюсь программистом, чисто любительски пишу для собственных нужд от редкого случая к случаю. Суть проблемы: ...

В случае передачи строки, метод выдаёт true, а в случае передачи значения типа int - false - C#
Всем привет! Почему в случае передачи строки, ниже приведённый метод выдаёт true, а в случае передачи значения типа int - false? ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.05.2014, 23:07
Ответ Создать тему
Опции темы

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