do - while循环,具有c中的多个条件

时间:2014-07-31 00:14:43

标签: c loops do-while

我正在尝试使用while-do循环在用户键入exit或退出时退出。由于某种原因,我无法理解我简单无法实现它。如果我单独应用其中一个条件它可以正常工作,但我需要同时具备这两个条件。

我在线搜索,我发现了几个例子,甚至在不同的编程语言上,例如(PHP)Do-While Loop with Multiple Conditions,(Python)How to do while loops with multiple conditions,(C ++)Using multiple conditions in a do…while loop等。但无论我遵循什么程序,我都可以同时使用这两个条件。

理想的解决方案是添加大写条件,但是一旦我解决了这个问题,我就可以解决这个问题。

也许一双新鲜的眼睛会看到我失踪的东西。

代码示例如下:

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

#define MAX_CHARACTERS 250
#define MAX_USERNAME 12
#define MAX_USERS 1024
#define MIN_REQUIRED 3
#define MAX_PORT 65536
#define MIN_PORT 1

typedef struct rec {
  char username[MAX_USERNAME];
  char msg[MAX_CHARACTERS];
}RECORD;

/* Usage Instructions void because we do not have any return */
int help(void) {
  printf("Usage: test.c [-s <arg0>] [-s <arg1>]\n");
  printf("\t-s: a string program name <arg0>\n");
  printf("\t-s: a string with a Nickname maximum characters %i <arg2>\n",MAX_USERNAME);
  return (1);
}

int main(int argc, char **argv) {

  if ( argc < MIN_REQUIRED ) {
    printf ("Please follow the instructions: not less than %i argument inputs\n",MIN_REQUIRED);
    return help();
  }
  else if ( argc > MIN_REQUIRED ) {
    printf ("Please follow the instructions: not more than %i argument inputs\n",MIN_REQUIRED);
    return help();
  }
  else {

    RECORD *ptr_record;

    ptr_record = (RECORD *) malloc (sizeof(RECORD));

    if (ptr_record == NULL) {
      printf("Out of memmory!\nExit!\n");
      exit(0);
    }

    char username_argv[MAX_USERNAME];

    memset( username_argv , '\0' , sizeof(username_argv) );

    if (strlen(argv[2]) > 12 ) {
      printf("Maximum characters for Nickname: %i\nPlease try again!\n",MAX_USERNAME);
      exit(0);
    }

    strcpy( username_argv , argv[1] );

    strncpy( (*ptr_record).username , username_argv , sizeof(username_argv) );

    printf("Username pointer: %s\n",(*ptr_record).username);

    do {
      printf("Please enter your MSG:\n");
      scanf ("%s",(*ptr_record).msg);
      printf("User MSG: %s\n",(*ptr_record).msg);
      //} while ((strcmp((*ptr_record).msg,"exit") != 0) || (strcmp((*ptr_record).msg,"quit") != 0));
      //} while (strcmp((*ptr_record).msg,"exit") || strcmp((*ptr_record).msg,"quit") != 0);
      //} while ((strcmp((*ptr_record).msg,"exit")) || (strcmp((*ptr_record).msg,"quit")) != 0);
      //} while ((*ptr_record).msg != "quit" || (*ptr_record).msg != "exit");
    } while (((*ptr_record).msg != exit) || ((*ptr_record).msg != ));

    free(ptr_record);

    return 0;
  } /* End of else */
} /* End of main() */"

4 个答案:

答案 0 :(得分:7)

你有没有尝试过:

} while ((strcmp((*ptr_record).msg,"exit") != 0) &&   
(strcmp((*ptr_record).msg,"quit") != 0));

您想要的是NOT (A OR B)而不是NOT A OR NOT B。请记住De Morgan laws表示NOT (A OR B)NOT A AND NOT B相同。

使用||是错误的,因为您将始终至少有一个条件(||的操作数)或另一个条件为真。

想象一下你的字符串是"exit"然后:

(strcmp((*ptr_record).msg,"exit") != 0)

是假的

但是

(strcmp((*ptr_record).msg,"quit") != 0)

是真的。

这意味着0 || 1产生1"quit"字符串(1 || 0产生1)相同(相反)。对于其他字符串,||的操作数均为11 || 1的操作数为1

答案 1 :(得分:3)

它不起作用,因为你要做的是DO循环WHILE字符串不同于"exit" AND字符串不同于{{1} }}

如果使用"quit",条件将始终为真,因为很明显,字符串不能同时具有这两个值。

OR

答案 2 :(得分:1)

示例中的所有行都使用逻辑OR运算符||来测试这两个条件。你有没有尝试过逻辑运算符&amp;&amp;代替?

OR的问题在于你设置它的方式,条件总是会通过,所以app永远不会退出。如果用户键入“退出”,则条件通过,因为他没有键入“退出”。同样,如果用户输入“exit”,那么他没有输入“quit”,因此条件仍然通过。而且,当然,如果他没有输入任何一个,那么条件就会过去。这并没有让你离开循环。

答案 3 :(得分:1)

试试这个。你应该使用&amp;&amp;运算符,因为两个条件都需要为true才能继续。

do {
      printf("Please enter your MSG:\n");
      scanf ("%s",(*ptr_record).msg);
      printf("User MSG: %s\n",(*ptr_record).msg);
      //} while ((strcmp((*ptr_record).msg,"exit") != 0) && (strcmp((*ptr_record).msg,"quit") != 0));
      //} while (strcmp((*ptr_record).msg,"exit") && strcmp((*ptr_record).msg,"quit") != 0);
      //} while ((strcmp((*ptr_record).msg,"exit")) && (strcmp((*ptr_record).msg,"quit")) != 0);
      //} while ((*ptr_record).msg != "quit" && (*ptr_record).msg != "exit");
    } while (((*ptr_record).msg != "exit") && ((*ptr_record).msg != "quit"));