2016-06-03 4 views
0

사용자가 배열 번호와 영문자를 입력하는 프로그램을 작성하려고합니다. 그런 다음 프로그램이 배열을 읽습니다. 숫자가 표시되면 프로그램은 해당 숫자를 하나의 스택으로 밀어 넣어야합니다. 그러나 알파벳 문자가 있으면 푸시 된 마지막 번호가 나타납니다. 내가 22a을 소개 출력 인 경우, 프로그램이 작동하지 않는 몇 가지 이유를 들어하나의 문자열에서 스택으로 푸시, 팝 및 디스플레이 기능을 사용합니다.

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <ctype.h> 

#define MAX 20 

int top, i; 
void push (double stack[], double x, int top) 
{ 
stack[top] = x; 
} 
int pop (double stack[]) 
{ 
    double x; 
    stack [top]=x; 
    return x; 
} 

void display (double stack[],int top) 
{ 
    int i; 
    printf ("\n The stack is: "); 
     for (i=0; i<=top; i++) 
     { 
      printf ("%lf\n",stack[i]); 
    } 
} 

void main() 
{ 
int r; 
int stack[10]; 
char array[10]; 
printf("introduce the numbers"); 
fgets(array,MAX,stdin); 
int l; 
r=strlen(array); 
top=0; 
for (l=0;l<=r;l++) 
{ 
int n; 
if (isdigit(array[l])) 
{ 
    push(stack,array[l],top); 
    top=top+1; 
} 

if (islower(array[l])) 
{ 
     pop(stack); 
     printf("you have popped %d", n); 
     top=top-1; 
} 
} 
display(stack,top); 
} 

:
you have popped 4194432 The stack is: 50.00000 50.00000

내가 특히 관심이 어떻게해야

은 지금까지 나는이 코드를 가지고 팝을 쓰고,이 프로그램이 작동하도록 푸시하고 표시하십시오. 내가 어떻게 해?

내가 C로 프로그래밍하고

주셔서 감사합니다

+1

을'# MAX 20'을 크기 10의 배열로 정의하십시오. 또한 루프에'for (l = 0; l <= r; l ++)'이 있습니다. 'l == r'이라면'stack [l]'에 접근하려고 시도 할 때 segfault가된다. – ForceBru

+0

더 많은 것은, 당신은'pop (stack)'을 호출하고 return value_ (!)를 사용하지 않음을 알기 때문에, 초기화되지 않은 변수'n'가 유용한 값을 가질 것이라고 생각하게하는 이유는 무엇입니까? – ForceBru

+0

루핑 할 때마다'for (i = 0; i <= threshold; i ++)'를합니다. 이것은 이해가되지 않습니다. 배열에서'treshold + 1' 값을 얻으려고합니다. 확실히 그들 중 단지 '임계 값'만을 원한다. – ForceBru

답변

3

첫째, 당신의 변수 n, 당신이 인쇄하고있는 값이 초기화되지 않은하고있는 메모리에 있던 어떤 쓰레기를 포함 창조의 순간.

왜 인쇄하고 있습니까? n = pop(stack);, 맞습니까? 그렇지 않으면이 인쇄는 쓸모가 없습니다.

코드 전체에서 루프를 잘못 작성하는 중입니다 : for (t=0; t<=threshold; t++). 이 코드를 실행하면 루프가 threshold + 1 번 실행되지만 분명히 threshold 만 원하기 때문에 대신 for (t=0; t<threshold; t++)을 실행하십시오.

또한 단지 10 문자를 개최 할 수 array로 ( fgets(array,MAX,stdin);) 최대 스무 문자를 읽고

.

어레이에서 strlen을 사용하려면 0으로 끝나야합니다 (널 종결 자). 당신의 코드에서 array 반드시 제로로 초기화되지 않으므로 array를 사용하기 전에 memset(array, 0, 10);를 사용 : 당신은 스물 개 문자를 읽고

  1. Docs on memset
  2. Tutorial on for loops
  3. void main() is wrong
  4. What to read to learn C