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

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

Войти
Регистрация
Восстановить пароль
 
uhx
60 / 60 / 6
Регистрация: 11.07.2013
Сообщений: 304
#1

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

13.03.2014, 21:15. Просмотров 425. Ответов 13
Метки нет (Все метки)

Короче, либо мне сейчас КТО-НИБУДЬ ПОМОЖЕТ, либо я... .. нувыпоняли.
ВООБЩЕМ
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, а не мусор вроде этого:
0
Миниатюры
Как сделать так, чтобы код вернул НОРМАЛЬНУЮ строку в pName, а не мусор  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2014, 21:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как сделать так, чтобы код вернул НОРМАЛЬНУЮ строку в pName, а не мусор (C++):

Работа с char. Как закончить строку, чтобы мусор не попадал? - C++
проблема в следующем. я открываю массив, но не знаю сколко там будет букв. но при обработке он мне пишет &quot;МММММММММММММ&quot; . как сделать,...

Подскажите как сделать, чтобы не выводился лишний мусор? - C++
Подскажите как сделать, чтобы не выводился лишний мусор? #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; bool...

Сделать так, чтобы функция возвращала как целые, так и дробные значения - C++
Задача: нужно найти среднее арифметическое чисел в одномерном массиве разных типов. В main() у пользователя спрашивается размер...

Сделать так, чтобы после ввода одного значения массива, не перескакивало на другую строку - C++
Возможно ли, и если возможно, то как, сделать так, чтобы после ввода одного значения массива, не перескакивало на другую строку? for...

код, который прекрасно выполняет Code::Blocks не выполняеться в Студии, как сделатьь так чтобы Студия воспринимала этот код?? - C++
Ребята, обьясните мне чего код, который прекрасно выполняет Code::Blocks не выполняеться в Студии, там требуються существенно другие...

Как сделать так,чтобы - C++
Собственно,здрасте. Собственно,я новичок в с++. В общем у меня возник вопрос: Сперва приведу пример,иначе не могу объяснить: int...

13
uhx
60 / 60 / 6
Регистрация: 11.07.2013
Сообщений: 304
13.03.2014, 21:17  [ТС] #2
Я уже как только код не корявил... че только не делал, вообщем хрень выводит. Голова уже не варит, а с указателями (char) так давно и не разобрался.
Прошу просто отредактировать код, чтобы все хорошо работало ._.
0
monolit
185 / 184 / 22
Регистрация: 24.03.2011
Сообщений: 667
Завершенные тесты: 1
13.03.2014, 21:21 #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;
}
1
ValeryS
Модератор
6654 / 5063 / 470
Регистрация: 14.02.2011
Сообщений: 16,930
13.03.2014, 21:22 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от uhx Посмотреть сообщение
char *pName = "";
память не выделил
этим ты присвоил указателю адрес пустой строки
Цитата Сообщение от uhx Посмотреть сообщение
pName[j] = path[i];
пишешь в не выделеную память
1
uhx
60 / 60 / 6
Регистрация: 11.07.2013
Сообщений: 304
13.03.2014, 21:23  [ТС] #5
АААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААА

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от monolit Посмотреть сообщение
А на картинке код у тебя совершенно другой...
На ней(картике) проблема в том, что массив pName в функции статический, и действует он только в функции. Т.е. при выходе из функции получаешь мусор (данные удаляются). Поэтому в таких случаях используй динамическую память (new, delete). И вообще, при использовании указателей не забывай выделять память (помимо тех случаев, где эти указатели указывают на уже выделенную динамически память).
Да я пытался как-то код поменять, думал может заработает.
И да, я знаю, как выделять память ))) Просто вообще из головы вылетело... сидел пол часа вдуплял.
И да, я знаю, что ее надо очищать перед выходом из проги, дабы не забивалась в оперативе.... вроде как.
0
uhx
60 / 60 / 6
Регистрация: 11.07.2013
Сообщений: 304
13.03.2014, 21:30  [ТС] #8
Криво объяснил, вообщем вот:
0
ValeryS
Модератор
6654 / 5063 / 470
Регистрация: 14.02.2011
Сообщений: 16,930
13.03.2014, 21:40 #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 в конце строки добавь иначе у тебя строка без конца
смотри как у меня сделано
1
uhx
60 / 60 / 6
Регистрация: 11.07.2013
Сообщений: 304
13.03.2014, 21:42  [ТС] #10
Цитата Сообщение от ValeryS Посмотреть сообщение
0 в конце строки добавь иначе у тебя строка без конца
смотри как у меня сделано
Спасибо!) Я понял.
0
ValeryS
Модератор
6654 / 5063 / 470
Регистрация: 14.02.2011
Сообщений: 16,930
13.03.2014, 21:49 #11
слушай а ведь имя файла наоборот должно бы вывестись?
что то я проглядел сначала
надо бы и разворот строки сделать
0
uhx
60 / 60 / 6
Регистрация: 11.07.2013
Сообщений: 304
13.03.2014, 21:54  [ТС] #12
Цитата Сообщение от ValeryS Посмотреть сообщение
слушай а ведь имя файла наоборот должно бы вывестись?
что то я проглядел сначала
надо бы и разворот строки сделать
Погоди, тут самый сок)))
Хочу рекурсивно это сделать.
Мол, циклами каждый может... ну все такое Другу, в ответ на "если не сможешь, завтра напишу алгоритм" пообещал)))
Я хочу использовать библиотек по минимуму.... А если открывать границы для всего, то тут и string + substr + find_last_of подойдет))
0
monolit
185 / 184 / 22
Регистрация: 24.03.2011
Сообщений: 667
Завершенные тесты: 1
13.03.2014, 22:37 #13
как раз не статический, был бы статический таких проблем
Я имел ввиду не static, а то, что он создается в стеке, и локален - неправильно выразился.
0
ValeryS
Модератор
6654 / 5063 / 470
Регистрация: 14.02.2011
Сообщений: 16,930
14.03.2014, 10:21 #14
Цитата Сообщение от monolit Посмотреть сообщение
Я имел ввиду не static, а то, что он создается в стеке, и локален - неправильно выразился.
Я это понял и поправил
чтобы другие неправильно не поняли

Добавлено через 11 часов 24 минуты
Цитата Сообщение от uhx Посмотреть сообщение
Хочу рекурсивно это сделать.
для рекурсии лучше подойдет статический буфер и счетчик
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2014, 10:21
Привет! Вот еще темы с ответами:

Как сделать так, чтобы число не повторялось? - C++
Вопрос следующий. В определенном диапазоне (например от 0 до 9) лежат числа, нужно сделать так, чтобы весь диапазон был выведен на экран,...

Как сделать так, чтобы запуск из *.exe не вылетал! - C++
Из командной строки все работает нормально, но запуск файла *.exe (этот файл я сам создовал, он откомпилированный!) не получается(( Как...

Как сделать так чтобы результат выводился в градусах ? - C++
Нужно что бы результат выводился в градусах, а то он выводит числа типо 0.0000034 и т д Если надо могу написать программу сюда С++

Как сделать так чтобы пользователь ввел TCHAR - C++
Как сделать так чтобы пользователь ввел TCHAR ?


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

Или воспользуйтесь поиском по форуму:
14
Yandex
Объявления
14.03.2014, 10:21
Ответ Создать тему
Опции темы

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