Язык C - Странные символы в выводе char[]

Мне пришлось создать программу C, которая преобразует инфиксную нотацию в постфиксную, используя STACK. Это прошло хорошо, и это работает в некотором роде. Это было давно, когда я в последний раз использовал язык C, поэтому я, вероятно, не очень хорошо использую переменные char[].

Итак, проблема в том, что когда я даю ввод следующим образом:

A+B*(C*E-D)

Моя программа возвращает это:

ABCE*D-*+ĚĚĚĚĚĚĚĚĚĚĚ

Итак, как вы видите, моя программа сделала постфиксное преобразование очень хорошо, но у меня есть куча "мусорных" символов в моем результате (ĚĚĚĚĚĚĚĚĚĚĚ).

Вот фрагмент моего кода (единственная часть, которую я считаю неправильной, возможно, что-то с char[] и способ, как я присваиваю значение переменной postfix[]:

int main()
{
    char infix[20], postfix[20];
    int len, tip, i, p=0;

    STACK pom;
    MAKE_NULL(&pom);

    printf ("Unesi izraz.\n");
    scanf ("%s", infix);

    len = strlen(infix);

    for(i=0; i<len; i++)
    {
        tip = nadi_tip(infix[i]);

        if (tip == Lijeva)
        {
            PUSH (infix[i], &pom);
        }

        if (tip == Operand)
        {
            postfix[p] = infix[i];
            p++;
        }

        if (tip == Desna)
        {
            while (!EMPTY(pom) && (TOP(pom)!= '('))
              {
                postfix[p++] = TOP(pom);
                POP (&pom);
              }
            POP (&pom);
        }

        if (tip == Operator)
        {
            while (!EMPTY(pom) && TOP(pom)!= '(')
             {
                if(prioritet(infix[i]) <= prioritet(TOP(pom)))
                {
                  postfix[p++] = TOP(pom);
                  POP (&pom);
                }
                else break;
             }
             PUSH(infix[i], &pom);
        }
    }
 while (EMPTY(pom) != 1)
 {
    postfix[p++] = TOP(pom);
    POP(&pom);
 }

 printf("Izlaz: %s", postfix);
 return 0;

}

infix[] — мой ввод, а postfix[] — мой вывод. Что я сделал не так я почему у меня есть символы ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ. Заранее спасибо!


person rjovic    schedule 09.11.2011    source источник
comment
Чувствуете, что вам не хватает нулевого терминатора в преобразованной строке?   -  person Eric J.    schedule 10.11.2011
comment
Спасибо вам всем!! Если бы я мог, я бы отметил все ваши ответы как правильные! Моя ошибка новичка :) Я забыл сделать кое-что основное :)   -  person rjovic    schedule 10.11.2011


Ответы (7)


Похоже, у вас нет терминатора NUL в строке postfix. Вы можете либо изменить определение на char postfix[20] = {0};, либо прямо перед printf добавить postfix[p] = '\0';

person Jerry Coffin    schedule 09.11.2011

Вам нужно завершить NUL postfix.

postfix[p] = 0;
printf...

Более простой (но немного менее эффективный) метод состоит в том, чтобы инициализировать ваш массив до {0} или memset до 0.

person cnicutar    schedule 09.11.2011

    char infix[20], postfix[20];

Вы не инициализируете их и не добавляете '\0' в конце алгоритма.

person Griwes    schedule 09.11.2011

Не похоже, что ваша строка завершается нулем.

person Jerry Snitselaar    schedule 09.11.2011

Как уже говорили другие, вы должны инициализировать свой массив.

Или, в любое время в программе, вы можете использовать,

memset (infix ,0, 20);
memset (postfix, 0, 20);

Это установит все значения элементов массива в ноль.

person cpx    schedule 09.11.2011

ВЫ НЕ ЗАВЕРШАЛИ СВОИ СТРОКИ NULL! Шутя. Вы уже получили это сообщение от тридцати или около того других людей, которые сказали вам? Просто чтобы добавить некоторую информацию в дополнение к этому, символы мусора - это попытка интерпретировать все, что происходит в памяти за пределами вашего char[], как символы. Он захватывает все, что может, из того, что находится в памяти, пока не наткнется на нулевой завершающий символ и не выплюнет все это, и причина, по которой это каждый раз одно и то же, заключается в том, что ваши char[] и ĚĚĚĚĚĚĚĚĚĚĚ размещаются рядом друг с другом каждый раз, когда программа запускается. Если вы уже все это знали, то прошу прощения, что отнял у вас время очередным лишним ответом.

person Zann Anderson    schedule 09.11.2011

Я предполагаю, что вы путаете символы и указатели на строки. Где определения для POP() и PUSH()? Что такое ndi_tip() Почему бы вам не использовать переключатель внутри цикла for, который намного легче читать и поддерживать.

person wildplasser    schedule 09.11.2011