Язык C - странные символы в выводе char [] - PullRequest
2 голосов
/ 10 ноября 2011

Мне пришлось создать программу на C, которая преобразует инфиксную нотацию в постфиксную нотацию с использованием STACK. Это прошло хорошо, и это работает в некотором роде. Это было давно, когда я в последний раз использовал язык Си, поэтому я, вероятно, не очень хорошо использую переменные 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 [] - мой вывод. Что я сделал не так? Почему у меня ĚĚĚĚĚĚĚĚĚĚĚ символов? Заранее спасибо!

Ответы [ 7 ]

4 голосов
/ 10 ноября 2011

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

.
3 голосов
/ 10 ноября 2011

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

3 голосов
/ 10 ноября 2011

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

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

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

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

3 голосов
/ 10 ноября 2011

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

3 голосов
/ 10 ноября 2011
    char infix[20], postfix[20];

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

3 голосов
/ 10 ноября 2011

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

postfix[p] = 0;
printf...

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

0 голосов
/ 10 ноября 2011

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

...