2017-01-08 15 views
0
void answerme(); 

int main() { 

char *answer = malloc (MAX_NAME_SZ); 
.... 

printf ("\nWould you like to begin? [Y/N]"); 
fgets (answer, MAX_NAME_SZ, stdin); 

answerme(); 

if(*answer == 'y' || *answer == 'Y'){ 
getinfo(); 
printf("\nprogram starting now..."); 
} 


else if(*answer == 'n' || *answer == 'N'){ 
printf("\nThank you, program will close now...."); 
return 0; 
} 
... 
}     //end of main 


void answerme(){      
char *answer = malloc (MAX_NAME_SZ); 
while(*answer !='n' && *answer != 'N' && *answer != 'y' && *answer != 'Y'){ 
    printf("\nPlease enter [Y], or [N]"); 
    fgets (answer, MAX_NAME_SZ, stdin); 
} 

}; 

このwhileループや関数全体のポイントは、ユーザーが別のランダムキーではなくy/nで質問に答えたかどうかをチェックする点です。私はこれがループの間、ユーザがそれを入力するまでY/N入力を求めることを続けたいと思う。しかし、何らかの理由でこのプログラムを実行すると、最初のステップでプログラムを開始するかどうか尋ねられ、Yと答えた場合、入力しても何らかの理由で「YまたはNを入力してください」と表示されます正解とし、「n」や他の任意の文字を入力すると、それはあなたを通させます。だから、それは入力を登録するようですが、何らかの理由で依然としてif(answer == Y)またはif(answer == N)にスキップするのではなく、whileループを実行するかどうかを尋ねます。whileループがプログラムで多くの問題を引き起こしている

これが起こっている理由を知っている人はいますか?

また、ユーザーが「Y」と発声してプログラムを開始すると、ユーザーに特定の情報を入力するように要求するメッセージが表示され、この情報は作成した構造に格納されますが(コードには表示されません)ループ中に、何とかスキップされます。このwhileループを離れるとプログラム全体が正常に動作しますが、もちろん、ユーザーは私が彼に尋ねたことを厳密に入力せずにプログラムのステップをスキップすることができます。

私が尋ねたことだけを入力するようにユーザーを制限するより良い代替方法がある場合は、これが過去3日間の問題と頭痛の原因となっていることを私に教えてください。ありがとうございました !

+0

、あなたは' * answer'をチェック - しかし、あなたがそれに任意の特定の値を割り当てないでください。初期化されていない変数にアクセスすることによって、プログラムは未定義の動作を示します。 'answerme'の' answer'というローカル変数は、 'main'の' answer'という名前のローカル変数とはまったく別のものです。 –

+0

'answerme()'の最後の '}'の後ろのセミコロンは余分なものであることに注意してください。 –

+0

適切な書式設定なしでたくさんの行を書いただけであれば、誰かがあなたの質問を読むことを奨励するので、より読みやすい方法で質問を書いてください。 –

答えて

2

問題は、関数内に変数*answerを設定し、メインプログラムに別の変数があることです。しかし、同じ変数であると予想されるようです。

これを修正するには、1つしか宣言せずに2つの関数を共有します。それを関数の外で宣言するか、mainからsubfunctionに渡すことでそれを行います。 malloc()は1回のみ指定する必要があります。パラメータの受け渡し技術の

例は次のとおりです。

answerme` `で
void answerme (char *answer) 
{      
    while (*answer !='n' && *answer != 'N' && 
      *answer != 'y' && *answer != 'Y') 
    { 
     printf ("\nPlease enter [Y], or [N]"); 
     fgets (answer, MAX_NAME_SZ, stdin); 
    } 
} 

int main() 
{ 

    char *answer = malloc (MAX_NAME_SZ); 
    .... 

    printf ("\nWould you like to begin? [Y/N]"); 
    fgets (answer, MAX_NAME_SZ, stdin); 

    answerme(answer); 

    if (*answer == 'y' || *answer == 'Y') 
    { 
     getinfo(); 
     printf("program starting now...\n"); 
    } 
    else 
    if (*answer == 'n' || *answer == 'N') 
    { 
     printf("Thank you, program will close now.\n"); 
     return 0; 
    } 
    ... 
}     //end of main 
+0

mainから "answerme"に渡すにはどうしたらいいですか?私はそのようなものを知っています:answerme(char * answer)< - メインの最初の格闘では、その後関数呼び出しでは "answerme(&answer)"と言っていますが、何らかの理由でそれはうまくいきません。 –

+0

@HomamMalkawi: – wallyk

+0

この例では、もっと簡単で最も良い方法は、(ソースの早い段階で)グローバルスコープで 'answer'を宣言することです。main()とanswerme()はこのグローバル変数に単純にアクセスできます。この変数は、単一のエンティティであるuser_から何かを受け取るために費やされていると仮定すると、グローバル変数の考え方は、パラメータを介して同じ値を回すのではなく、論理的です。 – linuxfan

0
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#define SIZE 10 
void answerme(); 

int main() { 

char answer[SIZE]="0"; 


printf ("\nWould you like to begin? [Y/N]"); 
scanf(" %s",answer); 
if((strcmp(answer,"y")==0) || (strcmp(answer,"Y")==0)) 
{ 
    printf("Answer is y\n"); 
    printf("\nprogram starting now..."); 
    answerme(); 
} 
else 
{ 
    printf("Wrong input..exiting\n"); 
    exit(1); 
} 
return 0; 
} 

void answerme() 
{      
    char answer[SIZE]="0"; 
    do 
    { 
      printf("\nPlease enter [Y], or [N]"); 
      scanf(" %s",answer); 
      printf("You entered %s\n",answer); 
    }while((strncmp(answer,"y",1)!=0) && (strncmp(answer,"Y",1)!=0) && (strncmp(answer,"n",1)!=0) && (strncmp(answer,"N",1)!=0)); 

} 
+0

'SIZE'が10のときに' malloc(SIZE) 'を使うのは間違っています。コードは 'char answer [SIZE];'を使用し、メモリーリークやチェックされていない割り当ての問題を回避する必要があります。 –

+0

ジョナサンを指摘してくれてありがとう。私はそれを訂正した。私が見落としたミスもありました。さて、それはすべて修正されました。 –

関連する問題