Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 23.11.2017
Сообщений: 63
1

Мусор в строке

06.08.2018, 23:18. Показов 1120. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет, пишу свой первый интерпретатор (логический) и даже что-то получается, но вот есть некая проблема, почему-то раньше все было с этим хорошо, а сейчас стало вот так вот выдавать При окончании работы функции opz, которая переводит привычную запись в обратную польскую, откуда-то появляется мусор в выводимой строке и ладно он был бы после '\0', он до и откуда он взялся ума не приложу, пытался уже, как я думаю все. Я перезаписывал строку в буфер и пытался чуть ли не на каждом шагу приписывать везде '\0', все без толку, все равно приписывает какой-то мусор и он очень-очень мешается, прошу помочь, заранее спасибо!

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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
int priority (char a) ///Функция выявления приоритета (готова)
{
    int n=0;
    switch (a)
    {
    case '!': ///Если это ^ или / , то наивысшее значение приоритета (5) (конъюнкция)
        { n = 5; break; }
    case '^': ///Если это ^ или / , то высшее значение приоритета (4) (конъюнкция)
        { n = 4; break; }
    case '+': ///Если это + , то среднее значение приоритета (3) (дизъюнкция)
        { n = 3; break; }
    case '-': ///Если это - или =, то низкое значенгие приоритета (2) (импликация, эквивалентность)
    case '=':
        { n = 2; break; }
    case '(': ///Если это (, то самое низкое значение
        { n = 1; break; } ///приоритета (1)
    }
    return n;
}
 
void operation_plus (int *top, int x) ///Функция для заноса операций в стек (готова)
{
    *top=*top+1; ///Собственно когда приходим с переменной, то повышаем значение top на 1
    st[*top]=x;  ///И присваиваем этому значению (макс.) значение новой операции
}
 
char operation_minus (int *top) ///Функция для выноса операций из стек (готова)
{
    char x; ///Выводной символ
    x=st[*top]; ///Он равен последнему значению в стек
    *top=*top-1; ///Теперь опускаемся ниже
    return x; ///Передаем операцию
}
 
char opz(char* a, char* out, int top, int k, int p) ///Функция преобразования в ОПЗ (готова)
{
    int i=0, j=0, r, v=0;
    int h;
    unsigned char sym;
    int c[256]={0};
    char digits[256];
    while ( a[k]!='=' ) ///Пока строка не законччилась
    {
        if ( a[k]==')' ) ///Если встречаем ), то
        {
            while( st[top]!='(' ) ///Все значения в стеке до ( выполняем
            {
                out[p++]=operation_minus(&top);
            }
            operation_minus(&top); ///Чистим эту скобочку
        }
 
        if ( a[k] >='a' && a[k]<='z') ///Если значение символа - константа (буква), то
        {
            out[p++]=a[k]; ///Заносим в выводную строку стразу
        }
 
        if ( a[k] >='0' && a[k]<='9') ///Если значение символа - константа (буква), то
        {
            out[p++]=a[k]; ///Заносим в выводную строку стразу
        }
 
 
        if ( a[k] == '(' ) ///Если значение символа это (, то
        {
            operation_plus(&top, '('); ///Передаем в ф-ю количество операций в стеке и код (
        }
 
        if ( a[k]=='+' || a[k]=='-' || a[k]=='^' || a[k]=='=' || a[k]=='!' ) ///Если значение символа это знак, то
        {
            if ( top==0 ) ///Если в стеке ничего нет, то сразу туда и заносим наше значение
            {
                operation_plus(&top, a[k]);
            }
 
            else ///Если же нет, то проверяем приоритет
            {
                if ( priority(st[top]) < priority(a[k]) ) ///Если приоритет того, что есть, больше, того, что сейчас, то
                {
                    operation_plus(&top, a[k]); ///Ставим то, что есть сейчас, на топ стека
                }
                else ///Если приоритет того, что есть, меньше, того, что сейчас, то
                {
                    while ( priority(st[top]) >= priority(a[k]) ) ///Пока приоритет того, что в стеке, больше (равен) того, что сейчас
                    {
                        out[p++]=operation_minus(&top); ///Присваиваем значение операции к последнему в выводной строке
                                            ///По сути делаем операци
                    }
                }
            }
        }
 
        k++; ///Переходим на другой символ
    }
 
    while(top!=0 && top > 0)
    {
        out[p++]=operation_minus(&top);
    }
    while (out[i]!='\0')
    {
        if (out[i] >= 'a' && out[i] <= 'z')
        {
            digits[j]=out[i];
            j++;
        }
        i++;
    }
    while (digits[v]!='\0') ///Подсчет переменных 
    {
        sym=digits[v];
        h=sym;
        c[h]++;
        v++;
    }
    r=0;
    for (i=0; i< 256; i++)
        if(c[i]>0)
            r++;
    kol = r;
    return *out;
}
 
 
int main()
{
    int top=0; ///Изначальное значение стек = 0;
    char a[80],   ///Исходная строка
         symbol,
         out[80]; ///Выводная строка
    int k=0,///Счетчики
        p=0,
        i=0,
        v=0;
    printf("Enter your  equation: ");
    scanf("%s", a); ///Вводим исходное значение
    v=strlen(a);
    symbol = a[v-1];
    opz(a, out, top, k, p); ///Перевод в опз
    f(out, symbol); ///Счет системы
    return 0;
}
Программа получает на вход логическое выражения типа: a+b^c=1, в процессе перевода в ОПЗ на выводную строку подается все, что до =, то есть =1 не учитывается
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.08.2018, 23:18
Ответы с готовыми решениями:

Мусор в строке
Добрый вечер, есть функция которая принимает строку типа char*, когда я передаю этой функции строку...

Выводит мусор в строке
Выводит мусор в конце строки 2 после функции str_tok хоть я и обнуляю последний элемент в ней ...

Мусор и вирусы на виртуалке == мусор и вирусы на пк?
Здравствуйте. Скажите пожалуйста - на сколько фактически изолированы виртуалки (в частности VMWare)...

Мусор
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #define n 10 int main() { int a,b,i,q; ...

2
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
06.08.2018, 23:51 2
Лучший ответ Сообщение было отмечено Кирилл Корнеев как решение

Решение

Цитата Сообщение от Кирилл Корнеев Посмотреть сообщение
все равно приписывает какой-то мусор
попробуйте вставить между строками 99 и 100
C
1
2
3
4
5
6
while(top!=0 && top > 0)
    {
        out[p++]=operation_minus(&top);
    } // строка 99
    out[p++] = 0; // <<<<<
    while (out[i]!='\0') // строка 100
1
0 / 0 / 0
Регистрация: 23.11.2017
Сообщений: 63
06.08.2018, 23:57  [ТС] 3
Цитата Сообщение от Max Dark Посмотреть сообщение
попробуйте вставить между строками 99 и 100
Спасибо, помогло
0
06.08.2018, 23:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.08.2018, 23:57
Помогаю со студенческими работами здесь

Мусор от mail.ru и Ко
Здравствуйте! Сегодня решила установить себе на компьютер новую операционную систему (старая ХР все...

Мусор и оператор new
Создаю глобальный указатель на структуру, инициализирую некоторые поля после выделения оператором...

Мусор в переменной
struct Planet { char name_of_planet; int Way; }; Planet **Make(int n); void Vivod(Planet...

Мусор в LCD
Здравствуйте! Радиоэлектроникой начал заниматся буквально месяца три назад узнал про архетиктуру...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru