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

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

03.02.2019, 16:29. Показов 4805. Ответов 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
362 / 216 / 53
Регистрация: 18.10.2017
Сообщений: 2,337
03.02.2019, 18:26
Лучший ответ Сообщение было отмечено Snow_Cold как решение

Решение

Это не то что косяк, т.е. нечто такое, что можно исправить, так в принципе нельзя делать.
1
2487 / 1151 / 709
Регистрация: 25.04.2016
Сообщений: 3,310
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
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru