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

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

Восстановить пароль Регистрация
 
Peperovich
43 / 43 / 4
Регистрация: 17.05.2011
Сообщений: 162
23.09.2013, 12:29     Почему выводит бред #1
Имеется следующий код

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;
}
Почему выводится бред какой-то.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2013, 12:29     Почему выводит бред
Посмотрите здесь:

C++ Почему не выводит m?
_getch() в цикле выводит бред вместо русских букв C++
C++ Почему не выводит?
почему выводит смайлики? C++
Почему не выводит на экран C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 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
5282 / 4801 / 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
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 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
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
23.09.2013, 15:00     Почему выводит бред #9
Цитата Сообщение от Ilot Посмотреть сообщение
Rivory, не забывайте про delete даже там где она явно не нужна. На бога надейся, а сам не плошай.
Какой тут может быть delete, если он память динамически нигде не выделяет?

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

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

почему выводит 0? C++
C++ почему выводит 0?
C++ Почему не выводит printf?

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

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

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