2011-11-09 3 views
2

STACK을 사용하여 후미 표기법으로 변환하는 C 프로그램을 작성해야했습니다. 그것은 잘되었고 그것은 어떤 식 으로든 작동합니다. 오래전에 C 언어를 사용했을 때 char [] 변수를 사용하지 않았을 것입니다.C langugage - char [] 출력의 "이상한"문자

A+B*(C*E-D) 

내 프로그램이 반환 :

그래서 문제는이 같은 입력을 줄 때이다

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

그래서 당신은 내 프로그램은 매우 잘 접미사 변환을 한 참조로하지만 난의 무리가 "쓰레기"는 내 결과에 영향을 미친다. 여기

내 코드 (나는, 문자와 아마 뭔가 [] 및 방법 접미사에하는 방법을 내가 값을 assing [] 변수 정확하지 않은 생각 유일한 부분의 조각입니다 :

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; 

} 

중위는 [] 내 입력 및 후위는 [] 내 출력됩니다. 내가 왜 ĚĚĚĚĚĚĚĚĚĚĚ 문자를 데 잘못 무슨 짓을. 사전에 감사합니다! 당신은 필요

+1

변환 된 문자열에 널 종결자가 누락 된 것처럼 느껴 집니까? –

+0

모두 감사합니다 !! 내가 할 수 있으면 나는 모든 답을 옳은 것으로 표시 할 것입니다! 초보자 실수 :) 나는 몇 가지 기본적인 일을 잊어 버렸습니다. :) – rjovic

답변

4

postfix 문자열에 NUL 터미네이터가없는 것 같습니다. 알고리즘의 끝에 '\ 0'당신은 char postfix[20] = {0};에 정의를 변경할 수 있습니다 중 하나, 또는 당신은 단지 printf 전에 postfix[p] = '\0';

3

postfix을 NUL을-종료합니다.

postfix[p] = 0; 
printf... 

간단하지만 (다소 덜 효율적인) 방법은 배열을 {0} 또는 memset0으로 초기화하는 것입니다.

3
char infix[20], postfix[20]; 

당신은이를 초기화하거나 추가하지 않습니다 추가 할 수 있습니다.

3

문자열이 null로 끝나는 것처럼 보이지 않습니다.

0

제 생각에 혼란스러운 캐릭터와 문자열에 대한 포인터입니다. POP() 및 PUSH()에 대한 정의는 어디에 있습니까? ndi_tip()이란 무엇입니까 for 루프의 스위치를 사용하면 훨씬 쉽게 읽고 유지 보수 할 수 있습니다.

3

다른 사람들은 배열을 초기화해야한다고 말했기 때문에. 제로로 배열 요소의 모든 값을 설정합니다

또는 프로그램에서 언제든지, 당신은 사용할 수

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

.

3

당신은 NULL이 아니며 귀하의 스트링을 종결하십시오! 키드. 당신에게 말한 30 명 정도의 다른 사람들로부터 그 메시지를 받았습니까? 그 위에 몇 가지 정보를 추가하기 만하면 가비지 문자는 문자로 char[]의 끝 부분을 초과하여 메모리에있는 것으로 해석되는 시도입니다. 그것은 메모리에있는 모든 것을 잡아서 null 문자를 마주 치고 그것을 모두 내뱉을 때까지 그리고 그 때마다 같은 이유는 프로그램이 실행될 때마다 char[]ĚĚĚĚĚĚĚĚĚĚĚ이 서로 옆에 할당된다는 것입니다. 당신이 이미이 모든 것을 알고 있다면, 나는 여분의 여분의 대답으로 당신의 시간을 낭비하는 것에 대해 사과드립니다.