2016-10-07 11 views
2

ここでは、文字列の中括弧のみをフィルタリングして配列に格納するスタックを実装しようとしています。私が書いたコードは、stackArrの配列に値を格納しました。しかし、私が配列を出力しようとするたびに、私のコードは失敗します。特定のエラーメッセージは表示されず、実行に失敗します。char配列に格納されている値を読み取る方法は?

私はこの問題は、以下の部分であると思う:

i = 0; 
while(stackArr[i] != '\0') 
{ 
    printf("%c ",stackArr[i]); 
    i++; 
} 

全コード:

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

int main() 
{ 
    char braces[10]; 
    char stackArr[10]; 
    int front = -1,rear = -1,size = 10; 
    gets(braces); 
    checkValidate(&braces,&stackArr,&front,&rear,size); 
} 

void checkValidate(char *braces,char *stackArr,int *front,int *rear,int size) 
{ 
    int i = 0; 
    while(braces[i] != '\0') 
    { 
     if((braces[i] == '(') || (braces[i] =='{') || (braces[i] =='[')) 
     { 
      push(braces[i],&stackArr,&front,&rear,size); 
     } 
     i++; 
    } 
    //print(&front,&rear,size,*stackArr); 
    i = 0; 
    while(stackArr[i] != '\0') 
    { 
     printf("%c ",stackArr[i]); 
     i++; 
    } 
} 

void push (char val,char *stackArr,int *front,int *rear,int size) 
{ 
    if(isFull(*front,*rear,size)) 
    { 
     printf("your string is larger that valid size\n"); 
    } 
    else 
    { 
     if(isEmpty(*front,*rear)) 
     { 
      *front = 0; 
     } 
     *rear = (*rear+1) % size; 

     stackArr[*rear] = val; 
     /*printf("%d ",*rear); 
     printf("%c",stackArr[*rear]); 
     printf("\n");*/ 
    } 
} 

int isEmpty(int front,int rear) 
{ 
    if(front == -1 && rear == -1) 
    { 
     return 1; 
    } 
    else 
    { 
     return 0; 
    } 
} 

int isFull(int front,int rear,int size) 
{ 
    if(front == 0 && rear == size -1) 
    { 
     return 1; 
    } 
    else 
    { 
     return 0; 
    } 
} 

void print(int *front,int *rear,int size,char *arr) 
{ 
    int i; 
    for(i = *rear;i != *front; i = (i-1)% size) 
    { 
     printf("%c\n",arr[i]); 
    } 
    printf("%c\n",arr[i]); 
} 
+1

入力としてどのデータを入力しますか? – dasblinkenlight

+0

式 '&braces'は' char'へのポインタを与えません。これは10個の 'char'要素の*配列*へのポインタを与えます。とても違う。また、関数を呼び出す前に関数プロトタイプ宣言を作成したことが記憶されていれば、コンパイラはあなたのためにキャッチしていたはずです。今のように警告を受けるべきです。 –

+0

@dasblinkenlightは "[{}]"のようなユーザー入力を提供しました –

答えて

4

ための機能が、貴社のコードは、コンパイル上の警告の多くを生成しなければなりませんコールには前方宣言がありません。したがって、コンパイラとみなし、呼び出すすべての関数の型がintのパラメータを持ち、さらにintを返します。あなたの関数は代わりにポインタを取るので、関数の呼び出しは未定義の動作となり、クラッシュする可能性があります。

// Put these declarations in front of main 
void checkValidate(char *braces,char *stackArr,int *front,int *rear,int size); 
void push (char val,char *stackArr,int *front,int *rear,int size); 
int isEmpty(int front,int rear); 
int isFull(int front,int rear,int size); 
void print(int *front,int *rear,int size,char *arr); 

この宣言を追加すると、この問題が解決されます。さらに、現在廃止予定のgetsコールを、バッファオーバーランから安全なfgetsへのコールで置き換える必要があります。

また、文字へのポインタを期待する関数に配列へのポインタを渡します。 bracesstackArrの前の&を削除する必要があります。コンパイラの警告を有効にして、これを実行する必要があるすべての場所を確認します。

最後に、コードでは、stackArrがヌル終了すると予想されますが、その要素は決してゼロに設定されません。 char stackArr[10] = {0}を追加して配列を0に初期化します。

+0

は、私はそれが、代わりに私の問題:( –

+0

を修正したファイルの末尾に '' int型メイン(ボイド)に移動し、正しい順序 –

+0

で関数を定義していないと付け加えたことはありません@ AL-zamiこれはあなたを取得します。編集を見てみてください[いくつかの出力](http://ideone.com/S49EJa)、それはあなたが見たいと思ったものですいませんが、少なくともそれはもはやクラッシュだかどうかわからない。 – dasblinkenlight

関連する問題