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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
SlesherY
6 / 6 / 1
Регистрация: 14.11.2011
Сообщений: 54
#1

проблема с передачей параметра функции - C++

14.11.2011, 13:12. Просмотров 1858. Ответов 41
Метки нет (Все метки)

Здравствуйте. Изучил уже 6 языков программирования, но С++ не дается как-то так просто.
Вот есть например часть кода.
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
31
#include <cstring>
#include <stdio.h>
#include <iostream>
#include <Windows.h>
 
int convert (){
char str[] = "Фізика";
char qwe[] = "";
   char c = 'і';
   char *p;
   int result;
   printf( "String :      %s\n", str );
   printf( "Search char:   %c\n", c );
   p = strchr( str, c );
   result = (int)(p - str + 1);
   if ( p != NULL )
      printf( "Result :   first %c found at position %d\n", 
              c, result );
   else
      printf( "Result :   %c not found\n" );
   *strchr( str, c ) = 'i';
   CharToOem(str, qwe);
   printf( "New String :      %s\n", qwe );
   int a;
   std::cin>>a;
    return 0;
}
 
int main() {
    convert();
}
если же сделать:
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
int convert [B](char str[])[/B]{
char qwe[] = "";
   char c = 'і';
   char *p;
   int result;
   printf( "String :      %s\n", str );
   printf( "Search char:   %c\n", c );
   p = strchr( str, c );
   result = (int)(p - str + 1);
   if ( p != NULL )
      printf( "Result :   first %c found at position %d\n", 
              c, result );
   else
      printf( "Result :   %c not found\n" );
   *strchr( str, c ) = 'i';
   CharToOem(str, qwe);
   printf( "New String :      %s\n", qwe );
   int a;
   std::cin>>a;
    return 0;
}
 
int main() {
    [B]convert("Фізика");[/B]
}
то идет ошибка:
Первый этап обработки исключения в "0x0080110a" в "code.exe": 0xC0000005: Нарушение прав доступа при записи "0x008058bd".
Необработанное исключение в "0x0080110a" в "code.exe": 0xC0000005: Нарушение прав доступа при записи "0x008058bd".
Первый этап обработки исключения в "0x0080110a" в "code.exe": 0xC0000005: Нарушение прав доступа при записи "0x008058bd".
Необработанное исключение в "0x0080110a" в "code.exe": 0xC0000005: Нарушение прав доступа при записи "0x008058bd".
2. Может есть какой-то способ заставить консоль воспринимать украинскую букву "і"? А то приходиться заменять ее на английский аналог.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2011, 13:12
Я подобрал для вас темы с готовыми решениями и ответами на вопрос проблема с передачей параметра функции (C++):

Проблема, связана с неправильной передачей параметров - C++
Создал на Fortran dll по вычислению некоторой функции: SUBROUTINE ARRAYTEST(x,arr) !MS$ATTRIBUTES DLLEXPORT :: ARRAYTEST use...

Вызов функции внутри другой функции с передачей локальной переменной по ссылке - C++
Столкнулся с очень с интересной проблемой. Можно ли так делать? #include &lt;iostream&gt; using std::cout; void f(const int &amp;ref){...

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

Функции с передачей разного количества параметров - C++
есть код: #include &lt;iostream&gt; using namespace std; void Char(int num, char a1, char a2, ...); void Int(int num, int a1, int...

Разработайте перегружены функции, в которые передаются два параметра типов int или float и три параметра типов - C++
Разработайте перегружены функции, в которые передаются два параметра типов int или float и три параметра типов int или float и возвращают...

Использование функции как параметра другой функции - C++
В задании указано, что функция P прибавляет значение функции ff к элементу массива, если он входит в промежуток от C до D, которые вводятся...

41
-=ЮрА=-
Заблокирован
Автор FAQ
14.11.2011, 16:16 #16
Вот вариант с std::string
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <string>
using namespace std;
 
//ГђГіГ±Г±ГЁГґГЁГЄГ*öèÿ
ostream& operator<<(ostream &stream,char* s)
{
    for(char* ps=s; *ps; ps++)
    {
        if(*ps=='Вё')
            stream<<char(241);
        else 
        if(*ps=='ВЁ')
            stream<<char(240);
        else 
        if(*ps>=-64 && *ps<=-17)                   
            stream<<char(*ps+64+128);
        else 
        if(*ps<0)
            stream<<char(*ps+64+176);
        else
            stream<<*ps;
    }
    return stream;
}
 
void convert (string str, char c)
{
    char * buf = new char[str.length() + 1];
    sprintf(buf,"%s",str.c_str());
    cout<<"String: "<<buf<<endl;
    cout<<"Search char: "<<c<<endl;
    int pos = str.find(c,0);
    if(pos != string::npos )
    {
        cout<<"Pos: "<<pos<<endl;
        sprintf(buf,"%s",(str.substr(pos,string::npos)).c_str());
        cout<<"New: "<<buf<<endl;
    }
    else 
       cout<<"Not found"<<endl;
    delete [] buf;
   
}
 
int main() 
{
    char str[] = "ÔèçèêГ*";
    convert(str, 'ГЁ');
    system("pause");
        return 0;
}
PS:В перегрузке не делал вывод украинского i - поэтому искал русскую и в слове Физика, по свободе подлатаю перегрузку ostream operator<<
0
Миниатюры
проблема с передачей параметра функции  
-=ЮрА=-
Заблокирован
Автор FAQ
14.11.2011, 16:19 #17
SlesherY,
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
CharToOem(p,p);
- хорошо сейчас сделаю с ЧарТоОем
0
talis
14.11.2011, 16:24
  #18

Не по теме:

SlesherY, как ТС той темы заявляю: для винды ответа на поставленный вопрос обнаружено не было. Похоже, только бубны.

0
-=ЮрА=-
Заблокирован
Автор FAQ
14.11.2011, 16:36 #19
SlesherY, вот ваше задание без лишних функций и хедеров в стиле Си
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <Windows.h>
#include <string.h>
#include <stdio.h>
 
int main() 
{
    char c = 'i';
    char str[] = "Г”içèêГ*";
    char * qwe = strchr( str, c );
    CharToOem(str,str);
    printf( "String :      %s\n", str );
    printf( "Search char:   %c\n", c );
    
    if(qwe != NULL)
    {
        printf( "Result : first %c found at position %d\n", c, strlen(str) - strlen(qwe) );
        printf("New : %s\n",qwe);
    }
    else
        printf( "Result :   %c not found\n",c );
    system("pause");
    return 0;
}
0
Миниатюры
проблема с передачей параметра функции  
-=ЮрА=-
14.11.2011, 16:37
  #20

Не по теме:

PS:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
char * qwe = strchr( str, c );
- часть str поєтому
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
CharToOem(str,str);
подконвертим как str так и qwe

0
Evg
Эксперт CАвтор FAQ
18884 / 6840 / 498
Регистрация: 30.03.2009
Сообщений: 19,255
Записей в блоге: 30
14.11.2011, 16:39 #21
Цитата Сообщение от SlesherY Посмотреть сообщение
ясно.спасибо.
да кстати return qwe; из convert() возвращает уже строковую константу. тоесть я должен объявить как char *convert (char str[]) , а потом уже принимать результат char *res;
res = convert(str);
.
qwe - это же чар[1000];
При этом надо понимать, если ты попытаешься вернуть указатель на локальный массив функции convert, то по завершении работы функции convert данный локал будет уже несуществующим и получится, что указатель смотрит на невалидную память
1
SlesherY
6 / 6 / 1
Регистрация: 14.11.2011
Сообщений: 54
14.11.2011, 16:41  [ТС] #22
-=ЮрА=-, спасибо. задание просто этим то не ограничевается. Мне как раз надо было разбить на несколько функций. Ну пока я свою проблему развязал и еще почерпнул много полезного.
Всем спасибо)
0
-=ЮрА=-
Заблокирован
Автор FAQ
14.11.2011, 16:52 #23
Цитата Сообщение от SlesherY Посмотреть сообщение
задание просто этим то не ограничевается.
- как оно звучит???

Не по теме:

Я потому и слил всё в тело main т.к. городить функцию пользователя на ровном месте для решения именно приведенного в топике задание аналогично 5-му колесу в телеге

0
SlesherY
6 / 6 / 1
Регистрация: 14.11.2011
Сообщений: 54
14.11.2011, 17:00  [ТС] #24
-=ЮрА=-, ну вообще я понемногу переделываю клиент для некоторой работы с БД с языка PHP на С++.
да, насколько я понял, если уже есть некое char str[1000] = "TEXT"; , то изменить его можно только при помощи strcpy(str, "another text")?
0
Evg
Эксперт CАвтор FAQ
18884 / 6840 / 498
Регистрация: 30.03.2009
Сообщений: 19,255
Записей в блоге: 30
14.11.2011, 17:07 #25
Цитата Сообщение от SlesherY Посмотреть сообщение
с языка PHP на С++
Тогда тебе небесами велено использовать std::string вместо работы с указателями на char
1
-=ЮрА=-
Заблокирован
Автор FAQ
14.11.2011, 17:27 #26
Цитата Сообщение от SlesherY Посмотреть сообщение
strcpy(str, "another text")?
- да можно, только вот "another text" не должен превышать длинны str лучше использовать sprintf(str,"%s","another text"); - на мой взгляд меньше граблей с перекрытием блоков памяти. Ну и если уж используем плюсы то std::string упомянутая Evg, имеет больший функционал чем char * (хотя CharToOem вы к string таким образом не примените
C++
1
2
string str = "БлаБлаБла";
CharToOem(str.c_str(),str.c_str())

думаю всё равно чаровский буферок потребуется, что-то вроди такого
C++
1
2
3
4
char * buf = new char[str.length()];
CharToOem(str.c_str(),buf);
str = buf;
delete [] buf;
1
Evg
Эксперт CАвтор FAQ
18884 / 6840 / 498
Регистрация: 30.03.2009
Сообщений: 19,255
Записей в блоге: 30
14.11.2011, 17:32 #27
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
лучше использовать sprintf(str,"%s","another text"); - на мой взгляд меньше граблей с перекрытием блоков памяти
Грабли ровно те же самые - отсутствие контроля за размером буфера. А вот с контролем - это strncpy и snprintf (есть не везде). Но контроль выражается в то, что лишняя часть строки будет молча откидываться, а потому такие простые решения годятся только для программ-самоделок.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
std::string имеет больший функционал чем char *
На самом деле любая частность (коей является класс string) ВСЕГДА имеет меньшие возможности, чем общий случай (коим является char*). std::string просто более удобен в работе, больше ничего особенно полезного или принципиально лучшего в нём нет
1
SlesherY
6 / 6 / 1
Регистрация: 14.11.2011
Сообщений: 54
14.11.2011, 17:32  [ТС] #28
Evg, значит будем использовать.
с буферком идея хорошая. Возможно и получше.
0
Evg
Эксперт CАвтор FAQ
18884 / 6840 / 498
Регистрация: 30.03.2009
Сообщений: 19,255
Записей в блоге: 30
14.11.2011, 17:35 #29
Цитата Сообщение от SlesherY Посмотреть сообщение
с буферком идея хорошая. Возможно и получше
Нет. В данном случае std::string является оптимальным решением, потому что в perl'е есть понятие строки, которое по простому отображается на плюсовые string'и. А работа с Си'шными буферами и указателями - это больше возможностей, чтобы ошибиться. Особенно если нет опыта работы с ними
0
-=ЮрА=-
Заблокирован
Автор FAQ
14.11.2011, 17:39 #30
Цитата Сообщение от Evg Посмотреть сообщение
std::string имеет больший функционал чем char *
- Evg, я под этим подразумевал уже наличие методов find erase sub, которые в char * ещё нужно писать, так на форуме string-ом почти не балуюсь, как и бустом, т.к предпочитаю своё "доморощенное магазинскому"А вот за strncpy не очень понял я к этому
C
1
2
3
char srs[] = "bla7bla";
char dst[4];
strncpy(dst,srs,3);
то далее сделав такое str[2] = '\0'; как мне кажется изменим и dst с bla на b, а вот sprintf вроди как работает с блоками отдельно
0
14.11.2011, 17:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2011, 17:39
Привет! Вот еще темы с ответами:

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

2 параметра в 1 функции - C++
Не знал как точно назвать тему, дело в том, что у меня есть вот такой вот код: void cmd_vcol( char *param ) { int ...

Функции в зависимости от параметра - C++
хз как точнее описать в общем можно ли сделать чтобы в классе появлялись (становились доступными в public) те или иные функции в...

Передача параметра функции - C++
Подскажите пожалуйста каким образом передавать уже явные параметры CreateRectRgn в параметры BitBlt или StreatchBlt не прибегая к...


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

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

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