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

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

Войти
Регистрация
Восстановить пароль
 
Max_t
2 / 2 / 0
Регистрация: 27.06.2013
Сообщений: 70
#1

Функция strlen перед вызовом моей функции портит строку в конфигурации Release MS Visual C++ 2013 - C++

24.08.2016, 23:45. Просмотров 197. Ответов 3
Метки нет (Все метки)

Написал функцию RemoveChars, которая убирает символы перевода строки в строке. Если в конфигурации проекта Visual C++ в Microsoft Visual Studio 2013 установлено Debug, проблем нет. Если перед вызовом функции RemoveChars вызывается функция strlen, а после нее RemoveChars, в конфигурации Release RemoveChars выдает пустую строку или короткую строку с мусором. RemoveChars(str1) выдает нормальную строку, RemoveChars(str2) не выдает. Что не так в этом коде, и как измерить длину строки а затем убрать символы перевода строки в конфигурации Release?

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
30
31
32
33
34
35
36
37
38
39
40
41
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
 
char * RemoveChars(char * initial_string)
{
    char result_string[2048] = {};
    int i = 0, j = 0;
    while (initial_string[i])
    {
        if ((initial_string[i] != '\r') && (initial_string[i] != '\n'))
            result_string[j++] = initial_string[i];
        i++;
    }
    result_string[j] = '\0';
    return result_string;
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    const size_t BuffSize = 2000;
 
    char str1[BuffSize] = {};
    char str2[BuffSize] = {};
 
    strcpy_s(str1, BuffSize, "12345");
    strcpy_s(str2, BuffSize, "67890");
 
    printf("str1: %s\n", str1);
    printf("RemoveChars(str1): %s\n", RemoveChars(str1));
 
    int a = strlen(str2);
 
    printf("strlen(str2)=%d\n", a);
 
    printf("str2: %s\n", str2);
    printf("RemoveChars(str2): %s\n", RemoveChars(str2));
    
    return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2016, 23:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция strlen перед вызовом моей функции портит строку в конфигурации Release MS Visual C++ 2013 (C++):

Задержка перед вызовом функции - C++
Как организовать задержку при вызове функции, можно в другом потоке. Спасибо.

Объявление функции перед ее вызовом - jQuery
Доброго времени суток! Я на javascript не так давно начал писать, по-этому, видимо, и возник вопрос. Следующий код: &lt;asp:Button...

Access 2013 портит файл базы accdb - MS Access
База разделена на несколько частей Клиентская - с формами, отчетами, запросами, временными таблицами - на нескольких клиентских...

Ошибка в release конфигурации - Delphi БД
Всем доброго времени суток , возникла интересная проблема !! Имеется Execute block в SQl который в свою очередь передается в...

Задержка перед вызовом ф-ции - JavaScript
вот вызывающая строка - jQuery(document).ready(function() {jQuery.scrollTo('#div_test',2000);}); помогите пожалуйста сделать...

Перед вызовом активити, вызвать DatePickerDialog - Программирование Android
Всем Здравствуйте! У меня есть button, который вызывает активити, надо на это button повесить еще вызов DatePickerDialog и потом...

3
HelicopterK52
680 / 205 / 28
Регистрация: 27.07.2016
Сообщений: 474
Завершенные тесты: 1
24.08.2016, 23:48 #2
Цитата Сообщение от Max_t Посмотреть сообщение
C++
1
return result_string;
массив result_string локальный и будет уничтожен при выходе из функции. В результате указатель будет "указывать" на память, которую уже может кто-то перезаписать.
0
Max_t
2 / 2 / 0
Регистрация: 27.06.2013
Сообщений: 70
25.08.2016, 01:44  [ТС] #3
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
массив result_string локальный и будет уничтожен при выходе из функции. В результате указатель будет не валидным.
Если можно, скажите подробнее, что надо сделать.

Добавлено через 1 час 54 минуты
Поиском нашел такой вариант, что о нем скажете по поводу безопасности и действительно ли освобождается память. Вроде бы работает, но ошибка плохо воспроизводится, поэтому сказать сложно.

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
char * RemoveCharsMalloc(char * initial_string) //Убираем символы перевода строки в строке типа char *
{
    char* result_string = (char *)malloc(2048 * sizeof(char));
    int i = 0, j = 0;
    while (initial_string[i])
    {
        if ((initial_string[i] != '\r') && (initial_string[i] != '\n'))
            result_string[j++] = initial_string[i];
        i++;
    }
    result_string[j] = '\0';
    return result_string;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    const size_t BuffSize = 2000;
    char str2[BuffSize] = {};
    strcpy_s(str2, BuffSize, "67890");
    int a = strlen(str2);
    printf("strlen(str2)=%d\n", a);
    char * str3 = RemoveCharsMalloc(str2);
        printf("str2: %s\n", str2);
    printf("RemoveChars(str2): %s\n", str3);
    free(str3); 
    return 0;
}
0
nd2
2353 / 1943 / 681
Регистрация: 29.01.2016
Сообщений: 6,326
25.08.2016, 04:40 #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
27
28
29
30
31
32
33
34
35
36
37
38
39
void RemoveChars(char * initial_string, char * result_string)
{
    
    int i = 0, j = 0;
    while (initial_string[i])
    {
        if ((initial_string[i] != '\r') && (initial_string[i] != '\n'))
            result_string[j++] = initial_string[i];
        i++;
    }
    result_string[j] = '\0';
}
 
int main ()
{
    const size_t BuffSize = 2000;
 
    char str1[BuffSize] = {};
    char str2[BuffSize] = {};
    char result_string[2048] = {};
 
    strcpy_s(str1, BuffSize, "12345");
    strcpy_s(str2, BuffSize, "67890");
 
    printf("str1: %s\n", str1);
    RemoveChars(str1, result_string);
    printf("RemoveChars(str1): %s\n", result_string);
 
    int a = strlen(str2);
 
    printf("strlen(str2)=%d\n", a);
 
    printf("str2: %s\n", str2);
    RemoveChars(str2, result_string);
    printf("RemoveChars(str2): %s\n", result_string);
    
    system("pause");
    return 0;
}
Добавлено через 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
30
31
32
33
34
35
36
37
void RemoveChars(char * initial_string)
{
    int i = 0, j = 0;
    while (initial_string[i])
    {
        if ((initial_string[i] != '\r') && (initial_string[i] != '\n'))
            initial_string[j++] = initial_string[i];
        i++;
    }
    initial_string[j] = '\0';
}
 
int main ()
{
    const size_t BuffSize = 2000;
 
    char str1[BuffSize] = {};
    char str2[BuffSize] = {};
    
    strcpy_s(str1, BuffSize, "12\r\r345\n");
    strcpy_s(str2, BuffSize, "\n67890\r\n");
 
    printf("str1: %s\n", str1);
    RemoveChars(str1);
    printf("RemoveChars(str1): %s\n", str1);
 
    int a = strlen(str2);
 
    printf("strlen(str2)=%d\n", a);
 
    printf("str2: %s\n", str2);
    RemoveChars(str2);
    printf("RemoveChars(str2): %s\n", str2);
    
    system("pause");
    return 0;
}
1
25.08.2016, 04:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2016, 04:40
Привет! Вот еще темы с ответами:

Как работают Debug\Release конфигурации - Visual Studio
Привет друзья! Начал изучать C# (до этого кодил на Adobe Flex SDK, actionscript). Хочу ясно представлять как работают Debug\Release...

Почему Release версия моей программы по разному отображается на разных Win - C++ WinAPI
На win 7/8 программа отображается вот так а на Win XP вот так прорисовуется. Как сделать, что-бы так же прорисовывалось, как на Win 8?

Дайте оценку моей конфигурации. - Выбор компьютера
Собрал комп: мать: ASUS M2N68 (не миниATX, но думаю ето не столь важно) проц: AMD Athlon 7750 Black Edition (хрен его знает что...

Оценить стоимость моей конфигурации - Оценка комплектующих
Вот,решил,что скоро продам свой комп и куплю новый,вот конфиг моего компа: Тип ЦП DualCore Intel Pentium D 925, 3000 MHz (12 x 250)(...


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

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

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