Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/23: Рейтинг темы: голосов - 23, средняя оценка - 4.70
0 / 0 / 0
Регистрация: 03.02.2019
Сообщений: 2

Printf влияет на работу программы

03.02.2019, 16:29. Показов 4830. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте ! Столкнулся с такой проблемой, есть программа которая должна декодировать сообщение. Проблема заключается в том что если удалить printf("ll %d \n ",digits[i]); (строка 73) в функции int* destructionNumber(int n,int siz); результат программы является нелогичным . Если данная строка присутствует все хорошо. Я работаю на Linux Mint . Тестовые значение ключ key = 1939 на выходе должно получиться "scout" .

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include<stdio.h>
#include <stddef.h>
#include<stdlib.h>
#include <unistd.h> 
 
char* decode (const unsigned char *code, size_t n, unsigned key);
int numberDigits( unsigned n);
int* destructionNumber(int n, int siz);
 
int main(){
    
    char a = 'f';
    char b = 'A';
    
    int c = 66, sizKey;
    int *p,i,j;
    unsigned key;
    
    unsigned char m1[]={20,12,18,30,21};
    
    char m2[5];
    
    printf("write key\n");
    scanf("%d",&key);
    
    sizKey = numberDigits(key);
    
    p=destructionNumber(key,sizKey);
    
    
    printf(" a = %d , b  = %c, c = %d, c = %c \n",a,b,c,c);
    
    for(i=0,j=0; i<sizeof(m1);i++,j++){
        
        if(j==sizKey){
        
            j=0;
        }
    
        m2[i]=(m1[i] - *(p+j))+96;
        
    }
    
    for(i=0;i<6;i++){
    
        printf("%c ",m2[i]);
    }
    printf("\n ");
    return 0;
}
 
int numberDigits( unsigned n){
    
    unsigned kol=0; 
    
    while(n>0){
        n/=10;
        kol++;
        
    }
    
    return kol;
 
}
 
int* destructionNumber(int n,int siz){
    
    //int siz = numberDigits(n);
    int digits[siz];
    int i,*p;
    for(int i=siz-1;i>=0;i--){
        digits[i]=n%10;
            printf("ll %d \n ",digits[i]); // <---
        n=n/10;
    }
    p=digits;
    
    return p;
}
 
char* decode (const unsigned char *code, size_t n, unsigned key){
 
    
    
    return NULL;
}
Подскажите где может быть проблема и как функция ввода-вывода влияет на работу программы ? Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.02.2019, 16:29
Ответы с готовыми решениями:

Влияет ли на систему и работу программ..?
Влияет ли на систему и работу программ, то что я меняю путь установки програм не на основной С:, а например игрушки, что б не путались на...

Насколько влияет возраст при приёме на работу?
Мне сейчас 24 года, лет с 11 дружил со сферой IT (бабушкин программист), однако, профессионально программированием решил заняться только...

Влияет ли количество запущенных программ на работу потока?
В программе часть кода работает в отдельном потоке, если я запускаю 2 экземпляр программы то скорость работы кода в потоке становиться...

8
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.02.2019, 16:43
Лучший ответ Сообщение было отмечено Snow_Cold как решение

Решение

Цитата Сообщение от Snow_Cold Посмотреть сообщение
и как функция ввода-вывода влияет на работу программы ?
Функция как-то использует стек. Как итог это может повлиять на те места, где имеется некорректное обращение за границу массива и программа начинает читать те незаконные места в стеке, где побывал printf
2
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
03.02.2019, 17:28
Лучший ответ Сообщение было отмечено Snow_Cold как решение

Решение

printf() не виноватый, там косяк с возвратом указателя на массив размещенный на стэке.
0
 Аватар для peter_irich
367 / 223 / 53
Регистрация: 18.10.2017
Сообщений: 2,387
03.02.2019, 18:26
Лучший ответ Сообщение было отмечено Snow_Cold как решение

Решение

Это не то что косяк, т.е. нечто такое, что можно исправить, так в принципе нельзя делать.
1
2492 / 1156 / 709
Регистрация: 25.04.2016
Сообщений: 3,323
04.02.2019, 03:25
Лучший ответ Сообщение было отмечено Snow_Cold как решение

Решение

Snow_Cold, по-хорошему, как-то так:
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <unistd.h>
#define SIZE_M 5
//размер m1 m2 ^
 
int * destructionNumber (int, int);     // массив из числа
int numberDigits (long int n);          // количество цифр в числе
 
/* для проверки: key = 1939, output "scout" */
int main (void)
{
    char m2[SIZE_M], m1[SIZE_M] = {20, 12, 18, 30, 21}; // закодированное сообщение
 
    long int key;               // наше число (набор ключей для расшифровки)
    printf("write key: ");      // получаем число с клавиатуры
    scanf("%ld", &key);
 
    int sizeKey = numberDigits(key);            // узнаем сколько цифр в числе key
    int * p = destructionNumber(key, sizeKey);  // создаем массив из цифр числа key
    if (p == NULL)          // если функция вернула нулевой указатель, а не массив
    {
        printf("Error allocate memory\n");  // сообщаем об ошибке
        return 1;                           // и выходим с кодом ошибки
    }
 
    // иначе декодируем:
    int i, j;
    for (i=j=0; i<SIZE_M; i++, j++)
    {
        if (j == sizeKey) j = 0;
        m2[i] = (m1[i] - p[j]) + 96;
    }
 
    for (i=0; i<SIZE_M; i++)                // и выводим результат на экран
        printf("%c", m2[i]);
    printf("\n");
 
    // освобождаем память и выходим
    free(p);
    return 0;
}
// ------------------------------------
int numberDigits (long int n)
{
    if (n < 0) return numberDigits(-n);
    else if (n > 9) return 1 + numberDigits(n/10);
    else return 1;
}
// ------------------------------------
int * destructionNumber (int n, int size)
{
    if (size < 1) return NULL;  // если размер 0, то и массива не получится
    int * digits = NULL;        // нулевой указатель на будущий массив
 
    /* запрашиваем память под массив для хранения всех цифр числа n */
    digits = (int*) malloc(sizeof(int)*size);
    if (digits == NULL) return NULL;    // если память не дали, то выходим
 
    /* заполняем массив цифрами из числа n */
    int i;
    for (i = size-1; i>=0; i--)
    {
        digits[i] = n%10;
        n = n/10;
    }
    return digits;  // возвращаем указатель на получившийся массив
}
Функция destructionNumber делает то же, что и ваша, только запрашивает память не из стека, а из кучи.

Добавлено через 1 минуту
Ну и как видите, она отлично работает и без printf()
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.02.2019, 12:24
Лучший ответ Сообщение было отмечено Snow_Cold как решение

Решение

Цитата Сообщение от stake-k26 Посмотреть сообщение
по-хорошему, как-то так
На всякий случай. Надо понимать, что это костыльный вариант. В правильно спроектированном софте память должна выделяться и освобождаться на одном и том же уровне. В нашем случае malloc должен делаться в функции main. Либо рядом с destructionNumber положить ещё одну функцию-финализатор, которая будет освобождать память. Для учебной программы это пофиг, а для большой софтины без этого можно очень быстро утонуть
0
04.02.2019, 14:34

Не по теме:

Цитата Сообщение от Evg Посмотреть сообщение
Надо понимать, что это костыльный вариант.
Цитата Сообщение от Evg Посмотреть сообщение
а для большой софтины без этого можно очень быстро утонуть
Может, вы и правы, хотя такие "фокусы" используются не так уж и редко.
Например, мне нравится пользовать вместо sprintf -
int asprintf(char **strp, const char *fmt, ...), которая сама высчитывает и аллокирует нужное количество памяти
Или - в glib тоже часто используются функции, наподобе
gchar * g_strdup (const gchar *str);
ИМХО - достаточно в описании прописать, что буфер должен быть освобожден вызовом free().

0
0 / 0 / 0
Регистрация: 03.02.2019
Сообщений: 2
04.02.2019, 15:03  [ТС]
Большое всем спасибо за помощь ! Теперь пойду разбираться в разнице стека и кучи
0
Evg
04.02.2019, 15:41

Не по теме:

Цитата Сообщение от gng Посмотреть сообщение
ИМХО - достаточно в описании прописать, что буфер должен быть освобожден вызовом free()
Понятно, что достаточно. Но лично у меня на первом месте всегда стоит требование читабельности кода. Код, в котором торчит вызов free с указателем, рождёным в непонятных глубинах, будет гораздо менее читабельным, чем если бы malloc был десятью строками выше по коду

strdup - это условно "плохая" функция, но она является частью стандарта и всем хорошо известна. Поэтому вызов strdup можно банально считать как эквивалент malloc'а. Если strdup и free находятся на одном уровне - код будет легко читаться. Если на разных уровнях, то сложно

asprintf, судя по всему, одно из множества г-изобретений gnu-колхозников, т.е. ну совсем не стандартная вещь. Более чем уверен, что этот кал не попадёт в нормальные стандарты, в отличие от других удачных gnu-расширений

Собственно, я никому не навязываю такой стиль. Но считаю, что если его придерживаться, то меньше будет проблем при написании большого софта, особенно если его разрабатывают десятки человек

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.02.2019, 15:41
Помогаю со студенческими работами здесь

Как влияет количество нейронов на скрытом слое на работу?
Приветствую. Решил создать простенькую нейронную сеть с помощью готовой библиотеки. ссылка На вход поставил 5 нейронов, на выходе 1, 2...

Влияет-ли выбор направления тока на работу электрической цепи?
влияет ли выбор положительного направления тока на работу электрической цепи? на результаты расчета? Правила форума: 5.16....

Самомодифицирующийся код программы влияет на скорость программы?
Самомодифицирующийся код программы влияет на скорость программы? Если да, то как и почему?

Влияет ли тип узла и DNS-суффикс подключения на работу интернета?
Влияет ли тип узла и DNS-суффикс подключения на работу интернета, например когда подключены несколько пк к роутеру ( на одном тип узла...

Оперативная память - что это и, как она влияет на работу компа
оперативная память, объясните пожалуйста что это и как она влияет на работу компа?


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru