-1

while ループ条件で独自のプロトタイプ関数を実行するにはどうすればよいですか?

#include <stdio.h>
#include <conio.h>
#include <string.h>

msghere(char *text){
    printf("%s",text);
    return 0;
}
void main(){
    char inp[256]={0};
    clrscr();
    while( strcmp(inp,"pass") && msghere("Error!")){
        memset(inp,0,strlen(inp));
        printf("Type \"pass\": ");
        gets(inp);
    }
    msghere("Right Answer!");
    getch();
}

このコードは、次の出力を出力します。

Error!Right Answer!
4

3 に答える 3

2

必要なのは、do-while ループと if 条件のようなものです。

int msghere(char *text){
    printf("%s",text);
    return 1;
}
int main(void)
{    
    do
    {
    //your code
    }while( (strcmp(inp, "pass") == 0 ? 0 : msghere("error!")) );
}

なぜdo-whileですか?
初めてチェックする前に、ユーザーに入力してもらいたいからです。論理的に正しいですか?

なんてこったwhile( (strcmp(inp, "pass") == 0 ? 0 : msghere("error!")) )
まず第一に、コーディングスタイルが悪い。if/else の短縮版です。最初の条件が true の場合、? の後の値を返します。それ以外の場合は、の後の値を返します:

1 を返す理由。msghere() で?
do while ループは、エラーが発生したかどうかを評価するためです。エラー == True -> やり直してください。

あなたがすべきこと:
は次のようなものです:

// your original msghere
int main(void)
{
  int passed = 0;  //false
  // some code
  while(!passed) //while not passed
  {
    //read input with fgets like said in the comments
    if(strcmp(inp, "pass") == 0)
    {
       passed = 1; // true
    }
    else
    {
      msghere("error");
    }
  }
}

ステータス変数を使用し、はるかに読みやすくなっています。

于 2013-10-31T13:16:23.920 に答える
1
#include <stdio.h>
#include <conio.h>
#include <string.h>

int msghere(const char *text)
{
    printf("%s",text);
    return 1; /* you want 1 instead of 0, because (strcmp != 0) && 1 == true */
}

int main(void)
{
    char inp[256];

    clrscr();
    do {
        printf("Type \"pass\": ");
        fgets(inp, sizeof inp, stdin); /* gets is deprecated, use fgets */
    } while (strcmp(inp, "pass\n") && msghere("Error!"));
    msghere("Right Answer!");
    getch();
    return 0;
}

編集:

\nパスインした後にあるのはなぜですかwhile((strcmp(inp, "pass\n") && msghere("Error!"))

fgetsは文字列の最後に余分なものを入れるため\n、次を使用してこの新しい行をスキップできます。

if (fgets(inp, sizeof inp, stdin) != 0)
{
    size_t len = strlen(inp);

    if (len > 0 && inp[len - 1] == '\n')
        inp[len - 1] = '\0';
    /* ... */
}

Turbo C または古いコンパイラを使用しているようですが、最新のコンパイラ (例: MinGW) を使用してください。さらに:

  • 初期化する必要はありませんinp
  • memset反復ごとに行う必要はありません
  • 関数は何らかの型 (この場合はint) またはvoid
  • const修飾子は、データ オブジェクトを変更できないものとして明示的に宣言します。これを使用して、コンパイラがより適切なコードを作成できるようにします。
  • int main(void)の代わりに 使用void main()
于 2013-10-31T13:16:14.033 に答える
0

strcmp() 関数は、string1 (またはその最初の n バイト) が string2 より小さい、一致する、または大きい場合に、ゼロより小さい、等しい、または大きい整数をそれぞれ返します。

したがって、while ループで strcmp を呼び出すとゼロ以外の値が返されるため、次の条件が評価されます。つまり、function(msghere)が呼び出されます。関数が実行され、結果が出力されてゼロが返されるため、while ループで条件が false になります。

さて、あなたは何をすべきか知っています。

于 2013-10-31T13:19:07.387 に答える