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

Как сделать так, чтобы код вернул НОРМАЛЬНУЮ строку в pName, а не мусор - C++

Восстановить пароль Регистрация
 
uhx
 Аватар для uhx
56 / 56 / 6
Регистрация: 11.07.2013
Сообщений: 300
13.03.2014, 21:15     Как сделать так, чтобы код вернул НОРМАЛЬНУЮ строку в pName, а не мусор #1
Короче, либо мне сейчас КТО-НИБУДЬ ПОМОЖЕТ, либо я... .. нувыпоняли.
ВООБЩЕМ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
char *GetProcName(char *path0){
    char *pName = "";
    char path[255];
    strcpy(path, path0);
    for(int i = strlen(path)-1, j=0; path[i] != '\\' ; i--, j++)
        pName[j] = path[i];
    return pName;
}
 
int main(int argc, char *argv[]){
    setlocale(0,"");
    char *pName;
    pName = GetProcName(argv[0]);
    system("pause>nul");
}
Как сделать так, чтобы код вернул НОРМАЛЬНУЮ строку в pName, а не мусор вроде этого:
Миниатюры
Как сделать так, чтобы код вернул НОРМАЛЬНУЮ строку в pName, а не мусор  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2014, 21:15     Как сделать так, чтобы код вернул НОРМАЛЬНУЮ строку в pName, а не мусор
Посмотрите здесь:

C++ Как сделать так, чтобы функции были не вложенными?
код, который прекрасно выполняет Code::Blocks не выполняеться в Студии, как сделатьь так чтобы Студия воспринимала этот код?? C++
C++ как сделать так, чтобы выдавало несколько одинаковых максимальных элементов столбца матрицы(код рабочий)
Как сделать так, чтобы запуск из *.exe не вылетал! C++
Как сделать так чтобы пользователь ввел TCHAR C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
uhx
 Аватар для uhx
56 / 56 / 6
Регистрация: 11.07.2013
Сообщений: 300
13.03.2014, 21:17  [ТС]     Как сделать так, чтобы код вернул НОРМАЛЬНУЮ строку в pName, а не мусор #2
Я уже как только код не корявил... че только не делал, вообщем хрень выводит. Голова уже не варит, а с указателями (char) так давно и не разобрался.
Прошу просто отредактировать код, чтобы все хорошо работало ._.
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
13.03.2014, 21:21     Как сделать так, чтобы код вернул НОРМАЛЬНУЮ строку в pName, а не мусор #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Память то сперва выдели, а потом уже туда пиши)
C++
1
2
3
4
5
6
7
8
char *GetProcName(char *path0){
    char *pName = new char[strlen(path0)+1]; //ну или сколько тебе нужно, хз(не забудь про нуль-символ)
    char path[255];
    strcpy(path, path0);
    for(int i = strlen(path)-1, j=0; path[i] != '\\' ; i--, j++)
        pName[j] = path[i];
    return pName;
}
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
13.03.2014, 21:22     Как сделать так, чтобы код вернул НОРМАЛЬНУЮ строку в pName, а не мусор #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от uhx Посмотреть сообщение
char *pName = "";
память не выделил
этим ты присвоил указателю адрес пустой строки
Цитата Сообщение от uhx Посмотреть сообщение
pName[j] = path[i];
пишешь в не выделеную память
uhx
 Аватар для uhx
56 / 56 / 6
Регистрация: 11.07.2013
Сообщений: 300
13.03.2014, 21:23  [ТС]     Как сделать так, чтобы код вернул НОРМАЛЬНУЮ строку в pName, а не мусор #5
АААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААА

Вообщем, спасибо.
Я туплю жестко... пишу и не понимаю, ЧТО не так.
Еще раз спасибо всем
я идиот....
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
13.03.2014, 21:24     Как сделать так, чтобы код вернул НОРМАЛЬНУЮ строку в pName, а не мусор #6
А на картинке код у тебя совершенно другой...
На ней(картике) проблема в том, что массив pName в функции статический, и действует он только в функции. Т.е. при выходе из функции получаешь мусор (данные удаляются). Поэтому в таких случаях используй динамическую память (new, delete). И вообще, при использовании указателей не забывай выделять память (помимо тех случаев, где эти указатели указывают на уже выделенную динамически память).

Добавлено через 12 секунд
А на картинке код у тебя совершенно другой...
На ней(картике) проблема в том, что массив pName в функции статический, и действует он только в функции. Т.е. при выходе из функции получаешь мусор (данные удаляются). Поэтому в таких случаях используй динамическую память (new, delete). И вообще, при использовании указателей не забывай выделять память (помимо тех случаев, где эти указатели указывают на уже выделенную динамически память).
uhx
 Аватар для uhx
56 / 56 / 6
Регистрация: 11.07.2013
Сообщений: 300
13.03.2014, 21:27  [ТС]     Как сделать так, чтобы код вернул НОРМАЛЬНУЮ строку в pName, а не мусор #7
Аяй, погодите.

опять мусор! Что ж такое-то...
Вообщем, в начало записывает, а когда вывожу - всякий хлам. Как убрать?

Добавлено через 1 минуту
Цитата Сообщение от monolit Посмотреть сообщение
А на картинке код у тебя совершенно другой...
На ней(картике) проблема в том, что массив pName в функции статический, и действует он только в функции. Т.е. при выходе из функции получаешь мусор (данные удаляются). Поэтому в таких случаях используй динамическую память (new, delete). И вообще, при использовании указателей не забывай выделять память (помимо тех случаев, где эти указатели указывают на уже выделенную динамически память).
Да я пытался как-то код поменять, думал может заработает.
И да, я знаю, как выделять память ))) Просто вообще из головы вылетело... сидел пол часа вдуплял.
И да, я знаю, что ее надо очищать перед выходом из проги, дабы не забивалась в оперативе.... вроде как.
uhx
 Аватар для uhx
56 / 56 / 6
Регистрация: 11.07.2013
Сообщений: 300
13.03.2014, 21:30  [ТС]     Как сделать так, чтобы код вернул НОРМАЛЬНУЮ строку в pName, а не мусор #8
Криво объяснил, вообщем вот:
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
13.03.2014, 21:40     Как сделать так, чтобы код вернул НОРМАЛЬНУЮ строку в pName, а не мусор #9
Цитата Сообщение от monolit Посмотреть сообщение
На ней(картике) проблема в том, что массив pName в функции статический,
как раз не статический, был бы статический таких проблем
Цитата Сообщение от monolit Посмотреть сообщение
Т.е. при выходе из функции получаешь мусор (данные удаляются).
не было бы
статические переменные не удаляются при выходе из функции
можно сказать, что статические переменные это глобальные переменные которые видны из одной функции
так что при статике можно написать так ,без выделения памяти
C++
1
2
3
4
5
6
7
8
9
10
11
12
char *GetProcName(char *path0){
   static char pName[255];
    int j=0;
    char path[255];
    strcpy(path, path0);
    for(int i = strlen(path)-1; path[i] != '\\' ; i--, j++)
        pName[j] = path[i];
 
  pName[j] ='\0';// добавляем в конец 0 чтобы получилась строка
    
return pName;
}
но тут возможен другой косяк

C++
1
2
char *str1=GetProcName("Мама мыла\\ раму");
char *str2=GetProcName("Мама мыла\\ кошку");
и str1 и str2 будет указывать на один и тот же буфер где будет написано "кошку"

Добавлено через 51 секунду
Цитата Сообщение от uhx Посмотреть сообщение
Вообщем, в начало записывает, а когда вывожу - всякий хлам. Как убрать?
0 в конце строки добавь иначе у тебя строка без конца
смотри как у меня сделано
uhx
 Аватар для uhx
56 / 56 / 6
Регистрация: 11.07.2013
Сообщений: 300
13.03.2014, 21:42  [ТС]     Как сделать так, чтобы код вернул НОРМАЛЬНУЮ строку в pName, а не мусор #10
Цитата Сообщение от ValeryS Посмотреть сообщение
0 в конце строки добавь иначе у тебя строка без конца
смотри как у меня сделано
Спасибо!) Я понял.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
13.03.2014, 21:49     Как сделать так, чтобы код вернул НОРМАЛЬНУЮ строку в pName, а не мусор #11
слушай а ведь имя файла наоборот должно бы вывестись?
что то я проглядел сначала
надо бы и разворот строки сделать
uhx
 Аватар для uhx
56 / 56 / 6
Регистрация: 11.07.2013
Сообщений: 300
13.03.2014, 21:54  [ТС]     Как сделать так, чтобы код вернул НОРМАЛЬНУЮ строку в pName, а не мусор #12
Цитата Сообщение от ValeryS Посмотреть сообщение
слушай а ведь имя файла наоборот должно бы вывестись?
что то я проглядел сначала
надо бы и разворот строки сделать
Погоди, тут самый сок)))
Хочу рекурсивно это сделать.
Мол, циклами каждый может... ну все такое Другу, в ответ на "если не сможешь, завтра напишу алгоритм" пообещал)))
Я хочу использовать библиотек по минимуму.... А если открывать границы для всего, то тут и string + substr + find_last_of подойдет))
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
13.03.2014, 22:37     Как сделать так, чтобы код вернул НОРМАЛЬНУЮ строку в pName, а не мусор #13
как раз не статический, был бы статический таких проблем
Я имел ввиду не static, а то, что он создается в стеке, и локален - неправильно выразился.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2014, 10:21     Как сделать так, чтобы код вернул НОРМАЛЬНУЮ строку в pName, а не мусор
Еще ссылки по теме:

C++ Как сделать так,чтобы
Сделать так, чтобы функция возвращала как целые, так и дробные значения C++
C++ Работа с char. Как закончить строку, чтобы мусор не попадал?

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
14.03.2014, 10:21     Как сделать так, чтобы код вернул НОРМАЛЬНУЮ строку в pName, а не мусор #14
Цитата Сообщение от monolit Посмотреть сообщение
Я имел ввиду не static, а то, что он создается в стеке, и локален - неправильно выразился.
Я это понял и поправил
чтобы другие неправильно не поняли

Добавлено через 11 часов 24 минуты
Цитата Сообщение от uhx Посмотреть сообщение
Хочу рекурсивно это сделать.
для рекурсии лучше подойдет статический буфер и счетчик
Yandex
Объявления
14.03.2014, 10:21     Как сделать так, чтобы код вернул НОРМАЛЬНУЮ строку в pName, а не мусор
Ответ Создать тему
Опции темы

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