Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
3 / 3 / 2
Регистрация: 27.06.2013
Сообщений: 91
1

Функция, получающая подстроку, возвращает испорченный указатель на строку

08.03.2015, 22:21. Просмотров 629. Ответов 1
Метки нет (Все метки)


Пытаюсь выделить подстроку в Microsoft Visual C++ 2013, чтобы убрать путь к файлу и оставить только имя файла.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
wchar_t * FileOnly(wchar_t * initial_string)
{
    bool contains_path = false;
    int result_string_index_number = 0;
    for (int i = 0; i < lstrlen(initial_string); i++)
    {
        if (initial_string[i] == '\\')
        {
            contains_path = true;
            result_string_index_number = i;
        }
    }
    if (contains_path == false)
    {
        return initial_string;
    }   
    wchar_t result_string[1024];
    wcsncpy_s(result_string, 1000, result_string_index, lstrlen(result_string_index));
    return result_string;
}
Или вручную, без использования wcsncpy_s.

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
wchar_t * FileOnly(wchar_t * initial_string)
{
    bool contains_path = false;
    int result_string_index_number = 0;
    for (int i = 0; i < lstrlen(initial_string); i++)
    {
        if (initial_string[i] == '\\')
        {
            contains_path = true;
            result_string_index_number = i;
        }
    }
    if (contains_path == false)
    {
        return initial_string;
    }   
    wchar_t result_string[1024];
    int i = 0, j = 0;
    while (initial_string[i])
    {
        if (i>result_string_index_number)
            result_string[j++] = initial_string[i];
        i++;
    }
    result_string[j] = '\0';    
    return result_string;
}
Полученный указатель на строку можно использовать в любой функции, и выдается строка, содержащая имя файла. Но если в функции, где используется указатель на строку, объявить массив, строку или другую переменную, состоящую из нескольких элементов, строка в этой функции портится, и при попытке ее вывести на печать выдается абракадабра. Сравнение с именем файла не работает. В чем здесь дело?

Добавлено через 34 минуты
Название темы не очень удачное - не получающая, а возвращающая подстроку. В первом варианте кода забыл указать строку, которая у меня есть.
C++
1
wchar_t * result_string_index = wcsrchr(initial_string, '\\') + 1;
Перед строкой
C++
1
wchar_t result_string[1024];
Вариант, который у меня.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
wchar_t * FileOnly(wchar_t * initial_string)
{
    bool contains_path = false;
    int result_string_index_number = 0;
    for (int i = 0; i < lstrlen(initial_string); i++)
    {
        if (initial_string[i] == '\\')
        {
            contains_path = true;
            result_string_index_number = i;
        }
    }
    if (contains_path == false)
    {
        return initial_string;
    }   
   wchar_t * result_string_index = wcsrchr(initial_string, '\\') + 1; 
   wchar_t result_string[1024];
    wcsncpy_s(result_string, 1000, result_string_index, lstrlen(result_string_index));
    return result_string;
}
Убрал эту функцию и объединил с другой функцией, где работаю не с указателем, а со строкой. Так вроде бы работает нормально. Но непонятно, в чем проблема с указателем, и есть ли альтернатива возвращению указателя на строку.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.03.2015, 22:21
Ответы с готовыми решениями:

Функция, получающая указатель на обычную функцию, получает указатель на метод класса
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть функция( f ), которая...

Функция возвращает строку (или указатель на начало строки)
Подскажите пожалуйста. Застрял на тривиальной задачке. Никак не могу добится чтобы функция...

Функция alltrim удаляет из строки начальные и конечные пробелы и возвращает указатель на преобразованную строку
Дали задание в ВУЗе. Назначение программы: Функция alltrim удаляет из строки начальные и конечные...

Функция с указателем и индексом(Удаляет в строке лидирующие пробелы. Возвращает указатель на преобразованную строку.)
Ребята помогите зачет получить, на парах не был..( Написать следующие функции в двух вариантах:...

1
Модератор
Эксперт С++
10385 / 8661 / 5241
Регистрация: 18.12.2011
Сообщений: 23,166
08.03.2015, 23:11 2
Надо возвратить адрес символа, с которого начинается имя и не создавать result_string
(т.к. она при выходе из функции удалится).
C++
1
return initial_string+result_string_index+1;
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.03.2015, 23:11

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Функция принимает указатель на void и возвращает указатель на int
Запишите прототип функции, которая принимает указатель на void и возвращает указатель на int.

Разработать и испытать функцию, которая переворачивает строку и возвращает указатель на перевёрнутую строку
Разработать и испытать функцию, которая переворачивает строку и возвращает указатель на...

Функция min_element() возвращает указатель на ноль
Необходимо найти максимальный элемент среди минимальных в двумерном массиве. Сначала ищу...

Функция формирует массив и возвращает указатель на него
Задание: написать функцию с аргументами: вещественное х, целое n. Функция формирует массив у:...


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

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

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