2017-06-06 10 views
-1

xをプログラムに挿入すると、スタックをどのように表示できますか?スタックCを表示する方法

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

struct Node 
{ 
    int Data; 
    struct Node* next; 
} * top; 

void popStack() 
{ 
    struct Node *temp, *var = top; 
    if (var == top) 
    { 
     top = top->next; 
     free(var); 
    } 
    else 
     printf("\nStack Empty"); 
} 

void push(int value) 
{ 
    struct Node* temp; 
    temp = (struct Node*)malloc(sizeof(struct Node)); 
    temp->Data = value; 
    if (top == NULL) 
    { 
     top = temp; 
     top->next = NULL; 
    } 
    else 
    { 
     temp->next = top; 
     top = temp; 
    } 
} 

void display() 
{ 
    struct Node* var = top; 
    if (var != NULL) 
    { 
     printf("\nElements are as:\n"); 
     while (var != NULL) 
     { 
      printf("\t%d\n", var->Data); 
      var = var->next; 
     } 
     printf("\n"); 
    } 
    else 
     printf("\nStack is Empty"); 
} 

int main(int argc, char* argv[]) 
{ 
    printf(" Wellcome to Basic Stacking. \n"); 
    top = NULL; 
    while (1) 

    { 

私はこのプログラムでは、Xを挿入した後、それは無限ループになり、スタックを表示しないと終了しないでください、私はプログラムがスタックを表示して終了したいが、それは動作しません。「×」を挿入私は何をすべきか????。

 char x ; 

     int value; 
     if (value != x) 
     { 

      printf("please enter Your Name:"); 
      scanf("%d", &value); 
      push(value); 
      fflush(stdin); 
      display(); 
     } 
     else 
     { 
      // popStack(); 
      display(); 
      break; 
     } 
    } 
    getch(); 
} 
+5

入力専用ストリーム( 'stdin'など)で' fflush'を呼び出すことは、C仕様で*未定義の動作*と明示的に言及されています。いくつかのライブラリはそれを拡張機能として実装していますが、実際にはこれをやめてください。 –

+2

もっとあなたの問題に関連しているのは、初期化される前に 'value'を使うという事実かもしれないので、* indeterminate *値があります。また、[小さなプログラムをデバッグする方法](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)についてもお読みください。 –

答えて

0

私はあなたの問題を見つけました。このプログラムはいつも無限ループになっていたので、これは頭痛のようなものでした。 しかし、問題はscanf("%d",&value)で文字を読んでいることです。このscanfはバッファからの入力を取り除かないので、後で行うscanfはすべて同じ入力( 'x')を持ち、scanfは読み取れません。 scanf関数が成功しなかった場合

printf("please enter Your Name:"); if(scanf("%d", &value)==0)value=x;

printf("please enter Your Name:"); scanf("%d", &value);

それではあなたは、ユーザが終了したいと仮定します。これらの行は、この変更を修正するために

これもまた重複した質問です。詳細はthis questionを参照してください。

1

すでに発見いくつかのプログラマーの男が、私は少しより明確になりたい:

char x; 
int value; 
if (value != x) 

xと値の両方が初期化されていない、彼らはにどんな値を保持することができます。それらを比較すると、一致する可能性はほとんどありませんが、最初にループに入るときでさえ、偶然に(即時の終了につながる)偶然起こる可能性があります。これは、変数xが最後に'x' –の値を保持し、それが初期化されていない変数を読み取るために、とにかく未定義の動作であることを、あまりにも、非常にそうです...

次の問題がある:あなたは、単にscanf("%d")を使用しています。 'x'文字を入力すると入力を読み取ろうとして失敗します。これは、数字としてスキャンすることができないためです。だから、最初に文字列を読んだ後に解析する必要があります。一緒に固定両方のエラーは、あなたのコードは次のようになります。(:行末の改行文字は、関数fgetsからもらった、つまりスペース文字を前に、ホワイトスペースをスキップするために必要とされる重要な)番号の後に追加の文字の

char buffer[128]; 
while(1) 
{ 
    if(!fgets(buffer, sizeof(buffer), stdin)) 
     break; // some error occured 
    if(*buffer == 'x') // you can compare directly, you don't need a char x = 'x'; ... 
     break; 
    int value; 
    char c; 
    if(sscanf(buffer, "%d %c", &value, &c) == 1) 
    { 
     // ... 
    } 
    else 
    { 
     puts("invalid input"); 
     fflush(stdout); 
    } 
} 

スキャンをsscanfの戻り値をチェックするとともに、 'abc'や '1xyz'のような無効な入力を検出します。さらに

、あなたのpopStack機能を見てみましょう:

struct Node* var = top; 
if (var == top) 

これは常にも、それはトップNULLで、trueになります。その後、varがあまりにも、NULLで、NULLは、それ自体に等しい、とコース...

あなたはむしろそれをこのように実行する必要があります。

if (top) 
{ 
    struct Node* var = top; 
    top = top->next; 
    free(var); 
} 

グッドプラクティスは、常にmalloc関数の戻り値をチェックしています。あなたのような小さなプログラムでは失敗してはいけませんが、最初から慣れていれば、大きなプログラムを書くときに忘れることはありません。

いくつかのコードの簡素化唯一の化粧品が、必要でない場合は...):

struct Node* temp = (struct Node*)malloc(sizeof(struct Node)); 
if(temp) 
{ 
    temp->Data = value; 
    temp->next = top; 
    top = temp; 
} 
else 
{ 
    // appropriate error handling 
} 

最後の一つの推薦:あなたの二つの機能は、機能的な対を形成するので、あまりにも、自分の名前でこれを反映好む:「プッシュ」と「ポップのいずれか"または" pushStack "と" popStack "を指定します。

0

valuexの比較では、常に未定義の動作が発生します。 valueの範囲はループ本体です。ループを回るたびに効果的に "新しい" valueが得られます。

scanfは番号を探しています。キーボードのxキーを押したときにループが終了すると予想される場合は、動作しません。 x%dの有効な一致シーケンスではないため、scanfは実際には失敗します。一方、xのASCIIコードである120を入力すると、ループの各繰り返しでvalueの同じ場所を再利用するという未定義の動作が含まれている可能性があるため、ループが終了することがあります。

これを修正するには、比較を行う前に読み取り値を定義して、それがxであるかどうかを確認します。また、たとえばfgets()を使用してそれを読み取ってから、xかどうかを確認してから、strtol()またはsscanf()を使用して数字に変換してください。

関連する問題