-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?
因为您希望您的用户在第一次检查之前进行输入。逻辑对吗?

WTF是“ while( (strcmp(inp, "pass") == 0 ? 0 : msghere("error!")) )”?
首先:糟糕的编码风格。这是一个简短版本的 if/else。如果第一个条件为真,则返回 ? 之后的值 否则返回之后的值:

为什么返回 1;在 msghere() 中?
因为您的 do while 循环将评估是否有错误。错误==真->再做一次。

你应该做什么:
类似于以下内容:

// 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

如果发现 string1(或其前 n 个字节)分别小于、匹配或大于 string2,则 strcmp() 函数返回小于、等于或大于零的整数。

因此,您在 while 循环中对strcmp的调用将返回非零值。因此,将评估下一个条件,即调用function(msghere)。该函数执行,打印结果并返回零,这使得条件在 while 循环中为假。

现在,你知道该怎么做了。

于 2013-10-31T13:19:07.387 回答