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

Указатели - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Помогите с выводом http://www.cyberforum.ru/cpp-beginners/thread374959.html
// Подключение Библиотек #include <iostream.h> #include <stdio.h> #include <math.h> #include <conio.h> #include <string.h> int main()
C++ Не сложные задачи по с++ Всем привет! нужна помощь Найти в массиве минимальный элемент и удалить. http://www.cyberforum.ru/cpp-beginners/thread374954.html
scanf() C++
Всем привет! Вот маленький тестовый пример #include <stdio.h> int i; int main() { printf("Enter value: \n");
C++ подскажите по строкам в С++
задание вот такое: Даны две строки, состоящие из слов, разделѐнных одним или несколькими пробелами. Из слов этих строк сформировать новую строку так, чтобы слова в ней чередовались: сначала слово из первой строки, затем через пробел – слово из другой строки и т.д., а в конце поместить слова, оставшиеся без пары. Слова в новой строке должны разделяться ровно одним пробелом. и я написал вот такой...
C++ Вычисление значения выражения http://www.cyberforum.ru/cpp-beginners/thread374936.html
Как записать вычисление этой суммы? Спасибо.
C++ Вычислить и вывести на экран в виде таблицы значения функции F на интервале от Х[нач] до Х[кон] с шагом dx. Вычислить и вывести на экран в виде таблицы значения функции F на интервале от Х до Х с шагом dx. -a-(x/10+b) при x<0 и b!=0 (!= это не равно) F= (х-a)/(x-c) при x>0 и b=0 3x+(2/c) в остальных случаях где a,b,c - действительные числа. Функция F должна принимать действительное значение, если выражение подробнее

Показать сообщение отдельно
Сыроежка
Заблокирован
30.10.2011, 17:43     Указатели
Цитата Сообщение от RRRONNN Посмотреть сообщение
Добрый вечер, не могу что-то разобраться. В первом CASE определяется M, например
М="kards\\cherv\\" , вот, а во втором CASE мне нужно к существующему М прибавить еще, например "2.bmp" , чтобы получилось М="kards\\cherv\\2.bmp" как это реализовать???
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
char* M;
char function(int i,int j)
{
switch (i)
 {
 case 0: M="kards\\cherv\\"; break;
 case 1: M="kards\\byb\\";   break;
 case 2: M="kards\\krest\\"; break;
 case 3: M="kards\\pik\\";   break;
}
 
switch (j)
 {
 case 0: M="2.bmp"; break;
 case 1: M="3.bmp"; break;
 case 2: M="4.bmp"; break;
 case 3: M="5.bmp"; break;
 case 4: M="6.bmp"; break;
case 5: M="7.bmp"; break;
case 6: M="8.bmp"; break;
case 7: M="9.bmp"; break;
case 8: M="10.bmp"; break;
case 9: M="J.bmp"; break;
case 10: M="Q.bmp"; break;
case 11: M="K.bmp"; break;
case 12: M="A.bmp"; break;
 }
 
return M;
}
Сначала нужно разобраться, что такое,например, "kards\\cherv\\", и что такое char* M;

"kards\\cherv\\", - это строковый литерал. Он имеет тип const char[], и стандарт языка С++ запрещает его изменять. Поэтому компилятор может поместить его в память только для чтения..

char* M - это указатель на тип chat, то есть, например, на 32-ьитовой платформе это просто ячейка памяти, равная по размеру типу int, которая хранит адрес какой-нибудь другой ячейки памяти.
Так как вы этого указателю хотите присвоить адрес строкового литерала, который имеет тип const char[],то лучше всего объявлять такой указатель как const char *M;, так как вы не можете менятьстрокорвый литерал.

Но у вас проблема в том,что вы хотите объединить двастроковых литерала. Поэтому вы должны использовать не указатель, а символьный массив, в который будете копировать строковые литералы в зависимости от переданной функции параметров.

Поэтому вам нужно объявлять не указатель M, а символьный массив достаточного размера, в который вы сможете скопировать заданные строковые литералы. Либо использовать стандартный шаблонный класс std::string.

Если вы используете символьные массивы, то нужно определить M как, например,

C++
1
char M[80] = {};
Есть специальная манифестная константа, которая задает максимальный размер пути. Поэтому вместо 80 в определении массива вы можете использовать эту константу. Не помню по памяти, как она называется, но что-то вроде MAX_PATH или MAX_FILENAME и обычно составляет 256 символов на платформе Windows.

Далее в своей функции вам нужно будет копировать в этот массив выбранные строковые литералы. Например,

C++
1
case 0: std::strcpy( M, "kards\\cherv\\" ); break;
Во втором switch предложении вы дописываете к первому строковому литералу второй строковый литерал в свой массив

case 0: std::strcat( M, "2.bmp" ); break;

Не забудьте включить для этих функций заголовок <cstring>
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru