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

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

Войти
Регистрация
Восстановить пароль
 
Peperovich
43 / 43 / 4
Регистрация: 17.05.2011
Сообщений: 162
#1

Почему выводит бред - C++

23.09.2013, 12:29. Просмотров 546. Ответов 10
Метки нет (Все метки)

Имеется следующий код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream> 
#include <locale>
 
using namespace std;
 
 const char* rename()
{
    char s[]="\\\\vmserver\\ОБЩЕЕ\\put.pdf";
    const char *temp=s;
    return temp;
}
 
int main() 
{ 
        locale::global(locale("rus"));
    const char *y=rename();
    for(int i=0;i<=2;i++)
    cout<<y[i];
    return 0;
}
Почему выводится бред какой-то.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rivory
146 / 112 / 2
Регистрация: 15.01.2013
Сообщений: 266
23.09.2013, 12:43     Почему выводит бред #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using namespace std;
 
const char* rename()
{
    char* s = new char[100];
    s = "\\\\vmserver\\ОБЩЕЕ\\put.pdf";
    const char* temp = s;
    return temp;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    locale::global(locale("rus"));
    const char* y = rename();
    for(int i = 0; i <= 23;i++)
        cout<<y[i];
    system("pause");
    return 0;
}
Работает. Почему Ваш вариант не работал, я так и не разобрался, возможно кто-то более опытный пояснит, но проблема была в том, что в массив s[] неправильно записывалась строка.
Ilot
Модератор
Эксперт С++
1785 / 1160 / 225
Регистрация: 16.05.2013
Сообщений: 3,056
Записей в блоге: 5
Завершенные тесты: 1
23.09.2013, 12:54     Почему выводит бред #3
Что написали то и имеете. Вы возвращаете указатель на автоматическую переменную объявленную в ф-и. Не знаю для чего нужна эта программа, но как вариант попробуйте объявить s статической.
C++
1
    static char s[]="\\\\vmserver\\ОБЩЕЕ\\put.pdf";
Rivory, не забывайте про delete даже там где она явно не нужна. На бога надейся, а сам не плошай.

Добавлено через 5 минут
А вообще-то хотелось бы знать для чего предназначенна программа.
Peperovich
43 / 43 / 4
Регистрация: 17.05.2011
Сообщений: 162
23.09.2013, 13:01  [ТС]     Почему выводит бред #4
Вообще это не полный код программы, сама программа вот:
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
#include <iostream> 
#include <fstream>
#include <locale>
 
using namespace std;
 const char* rename()
{
    char s[]="\\\\vmserver\\ОБЩЕЕ\\pu23t.pdf";
    const char *temp=s;
    return temp;
}
 
int main() 
{ 
    locale::global(locale("rus"));
    const char *y="as";
        y=rename();
    for(int i=0;i<=2;i++)
    cout<<y[i];
    ofstream to("\\\\vmserver\\ОБЩЕЕ\\put.pdf",ios::binary);
    ifstream from("C:\\Users\\Kirill\\Desktop\\Книги\\Unix\\Advanced Bash-Scripting Guide.pdf",ios::binary);
    char ch;
    while (from.get(ch)) to.put(ch);
    to.close(); 
    return 0;
}
Как можно догадаться (или нельзя), но я написал функцию для того чтобы менять имя файла в переменной to. А там путь задается именно const char *. Ну сама функция конечно же не дописана.

static все исправил. Да, спасибо Ilot, как говорится пока не столкнешься не поймешь. А я читал об этом. Что пользоваться данными переменных созданных в функции очень плохо, так как не понятно что они будут содержать после выхода из функции.
Rivory
146 / 112 / 2
Регистрация: 15.01.2013
Сообщений: 266
23.09.2013, 13:05     Почему выводит бред #5
Цитата Сообщение от Ilot Посмотреть сообщение
Rivory, не забывайте про delete даже там где она явно не нужна. На бога надейся, а сам не плошай.
Самое интересное, что я не забыл про delete, но когда я его писал
C++
1
2
3
4
5
6
7
8
const char* rename()
{
    char* s = new char[100];
    s = "\\\\vmserver\\ОБЩЕЕ\\put.pdf";
    const char* temp = s;
    delete s;
    return temp;
}
У меня вылетал Access violation.
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.09.2013, 13:09     Почему выводит бред #6
Цитата Сообщение от Peperovich Посмотреть сообщение
я написал функцию для того чтобы менять имя файла в переменной to.
Если таким способом решили, то вот:
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
#include <iostream> 
#include <fstream>
#include <locale>
 
using namespace std;
 const char* rename()
{
    const char *temp = "\\\\vmserver\\ОБЩЕЕ\\pu23t.pdf";
    return temp;
}
 
int main() 
{ 
    locale::global(locale("rus"));
    const char *y="as";
        y=rename();
    for(int i=0;i<=2;i++)
    cout<<y[i];
    ofstream to("\\\\vmserver\\ОБЩЕЕ\\put.pdf",ios::binary);
    ifstream from("C:\\Users\\Kirill\\Desktop\\Книги\\Unix\\Advanced Bash-Scripting Guide.pdf",ios::binary);
    char ch;
    while (from.get(ch)) to.put(ch);
    to.close(); 
    return 0;
}
Ilot
Модератор
Эксперт С++
1785 / 1160 / 225
Регистрация: 16.05.2013
Сообщений: 3,056
Записей в блоге: 5
Завершенные тесты: 1
23.09.2013, 13:12     Почему выводит бред #7
Ну так правильно вы массив не правильно удаляете.
C++
1
   delete [] s;
C++
1
2
    const char *y="as";
        y=rename();
Смысл разделения этих строк для меня остается загадкой... Зачем резервировать память для массива если вы им не собираетесь пользоваться?
Peperovich
43 / 43 / 4
Регистрация: 17.05.2011
Сообщений: 162
23.09.2013, 13:18  [ТС]     Почему выводит бред #8
Вот законченная версия того, что мне нужно было.

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
#include <iostream> 
#include <fstream>
#include <locale>
#include <time.h>
 
 
using namespace std;
 const char* rename()
{
    static char s[]="\\\\vmserver\\ОБЩЕЕ\\put.pdf";
    int i=rand()%10+1;
    s[18]=static_cast<char>(i+'0');
    const char *temp=s;
    return temp;
}
 
int main() 
{ 
    locale::global(locale("rus"));
    while(1)
    {
    ofstream to(rename(),ios::binary);
    ifstream from("C:\\Users\\Kirill\\Desktop\\Книги\\Unix\\Advanced Bash-Scripting Guide.pdf",ios::binary);
    char ch;
    while (from.get(ch)) to.put(ch);
    to.close(); 
    }
    return 0;
}
Добавлено через 5 минут
Цитата Сообщение от Ilot Посмотреть сообщение
Ну так правильно вы массив не правильно удаляете.
C++
1
   delete [] s;
C++
1
2
    const char *y="as";
        y=rename();
Смысл разделения этих строк для меня остается загадкой... Зачем резервировать память для массива если вы им не собираетесь пользоваться?
Это я эксперементировал, до того как создал пост. Потому, что не мог понять почему выводит бред. Сейчас как видите, этих строк нет уже.
castaway
Эксперт С++
4876 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,075
Записей в блоге: 10
Завершенные тесты: 1
23.09.2013, 15:00     Почему выводит бред #9
Цитата Сообщение от Ilot Посмотреть сообщение
Rivory, не забывайте про delete даже там где она явно не нужна. На бога надейся, а сам не плошай.
Какой тут может быть delete, если он память динамически нигде не выделяет?

Цитата Сообщение от Ilot Посмотреть сообщение
Ну так правильно вы массив не правильно удаляете.
Он возвращает освобожденный указатель, вот в чем проблема.

Зачем давать советы в том, в чем вы сами не разбираетесь?
Ilot
Модератор
Эксперт С++
1785 / 1160 / 225
Регистрация: 16.05.2013
Сообщений: 3,056
Записей в блоге: 5
Завершенные тесты: 1
23.09.2013, 15:54     Почему выводит бред #10
Зачем давать советы в том, в чем вы сами не разбираетесь?
А вы что предлагаете сидеть на попе ровно? Я действительно только изучаю си поэтому и общаюсь на этом форуме. Всегда быть правым тяжело вы не находите? А минусовать по этому поводу подло. Я никого не оскорбляю, а пытаюсь помочь пусть при этом я не всегда оказываюсь правым. Свое мнение я не навязываю.
Так что это не красиво с вашей стороны ставить на вид какой вы у нас умный, а мы тут все так... погулять вышли. Написали бы просто, что ты мол товарищ не прав вот тут и вот тут и я был бы вам благодарен. А сейчас у меня складывается о вас не совсем хорошее мнение...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2013, 16:00     Почему выводит бред
Еще ссылки по теме:

C++ Выводит не правильно, почему?
почему выводит 0? C++
C++ почему выводит 0?
C++ Почему не выводит printf?
Почему выводит нули? #c++ C++

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4876 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,075
Записей в блоге: 10
Завершенные тесты: 1
23.09.2013, 16:00     Почему выводит бред #11
Цитата Сообщение от Ilot Посмотреть сообщение
Всегда быть правым тяжело вы не находите?
Не нахожу.
Цитата Сообщение от Ilot Посмотреть сообщение
А минусовать по этому поводу подло.
Подло давать заведомо не правильные советы, вы не находите?
Если вы заметили, то я не показывал насколько я умный.
А нехорошее мнение у вас обо мне складывается скорее всего потому, что вы не можете адекватно оценить ситуацию и понять свою ошибку.
Больше тут добавить нечего.
Yandex
Объявления
23.09.2013, 16:00     Почему выводит бред
Ответ Создать тему
Опции темы

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