2016-07-18 4 views
0

ユーザには1つの文字を入力させたい場合は、C言語でどうやってやりますか?私のこの試みは以下の通りですが、恐ろしく失敗しました。私がオンラインで読んだところから、これを達成するためにファンクションやファットを使うことができると聞いていましたが、どうやって解決するのか分かりませんでした。私はどのようにしてユーザに1文字の入力を許可するのですか

do 
{ 
    geussNumber += 1; 
    printf("Enter guess number %d\n", geussNumber); 
    scanf(" %c", &geussLetter); 
    scanf ("%c", &inputViolation); 
     if (isalpha(geussLetter) == 0) 
     { 
      printf("You did not enter a letter\n"); 
     } 
     else if (inputViolation == true) 
     { 
      printf("You eneterd more than one letter\n"); 
     } 
     else 
     { 
     inputLoopEnd = 1; 
     } 
} 
while(inputLoopEnd == false); 
+0

'inputViolation == true 'は恐ろしいです...私はそれが少なくともいくつかの文字と比較されるべきだと思います。 – MikeCAT

+1

いいえ、 'gets()'はバッファオーバーランの危険性が避けられず、C99で廃止され、C11から削除されるため、使用できません。 – MikeCAT

+0

私は、入力文字列に0以外の文字(cでtrue)を読み込んだ場合、ユーザーが複数の文字を入力したと考えていました。 –

答えて

-1

はfgetsのようなもの()またはfputs()などを使用しないでください...彼らは使用から下落しています。

here ...この関数はstr型のオブジェクトを扱うように設計されており、現時点では文字の使用に専念しています。

あなたはこれをあなたができると思う方法を行うことができない...

scanf(" %c", &geussLetter); 
scanf ("%c", &inputViolation); 

ユーザーが唯一の彼らがすることになっている方法のcharに入っても、それはまだですので、これは動作しないことができますあなたのinputViolationスキームをトリガーするつもりです。

編集:2016年7月20日12:14

私は本当にコミュニティのwikiにMOHAMAD's solutionの優雅さのような。

あなたの状況に合わせて編集しましたので、ここでもうまくいきます。同じ考えです...

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

int clean_stdin() 
{ 
    while (getchar() != '\n'); 
    return 1; 
} 

int main(void) 
{ 
    int first_time_around = 0; 
    char theguess = 0; 
    char c; 
    do 
    { 
     if (first_time_around == 0) 
      first_time_around++; 
     else 
      printf("Wrong input \n"); 

     printf("Enter guess number: \n"); 

    } while (((scanf("%c%c", &theguess, &c) != 2 || c != '\n') 
      && clean_stdin()) || !isalpha(theguess)); 

    return 0; 
} 
+0

誰かが建設的な批判なしで答えを投票したときには大好きです。ありがとう<.< ^.^ >。> –

+0

@JeremyGarnet偉大な答えをありがとうが、私は "substr()メソッド"を使用して、charを保存する必要がありますことを意味理解していません。 –

+0

@JMaklen私はコミュニティWikiではるかに優れたソリューションを見つけました。あなたの状況によく合います。 –

3

getcファミリの機能を使用できます。

たとえば、http://quiz.geeksforgeeks.org/difference-getchar-getch-getc-getche/をご覧ください。

+1

私は、「** getch」ファミリの関数群とは厳密には呼ばれません。なぜなら、** C **についての質問は、C標準のメンバーでなくても/ Oが、Microsoftの拡張子 ''の一部であると誤解されています。 "' '関数のgetc'ファミリはもっと​​正しいでしょう。 – user3078414

+0

あなたはありがとうございます。私は私の答えを更新しました。 –

0

あなたが一度に入力1行を読みたい(すなわちユーザーの種類一文字推測し、その後<>が入る)ようだ、とあなたは推測が確かに一つだけの文字が含まれていることを確認します。これらの用語で問題を解決すると、おそらくfgets()が適用される可能性があることが明確になります。その目的は、一度に1行ずつ読むことです。行全体を読み込んだら、少なくともバッファーが対応できる程度に読み込んだら、それを検証して推測を抽出することができます。

scanf()は適切に使用するのが難しいので、私はfgets()アプローチをお勧めします。あなたがscanf()を使う、という場合は、しかし、あなたはこのようにそれを行う可能性があります:

// consumes leading whitespace, inputs one character, then consumes any 
// immediately-following run of spaces and tabs: 
int result = scanf(" %c%*[ \t]", &guessLetter); 

if (result == EOF) { 
    // handle end-of-file ... 
} else { 
    assert(result == 1); // optional; requires assert.h 

    int nextChar = getchar(); 

    if ((nextChar == '\n') || (nextChar == EOF)) { 
     // handle multiple-character guess ... 
    } else if (!isalpha(guessLetter)) { 
     // handle non-alphabetic guess ... 
    } else { 
     // it's valid ... 
    } 
} 
+0

なぜこのコードをお持ちですか? (結果== EOF)ユーザがファイルではなく入力した入力ストリームからの入力を取得していますか? –

+0

@JMaklen、ファイルの終わりもいくつかの方法のいずれかで標準入力でも起こる可能性があります。プログラムの通常の使用でその結果が期待されない場合でも、決して起こらないと仮定するのは貧しい形式です。 –

+0

scanfを使用している場合、どうすればEOFを取得できますか?ユーザーは値を入力できますが、ファイルにどのように入力しますか? –

関連する問題