【问题标题】:do - while loop with multiple conditions in Cdo - 在 C 中具有多个条件的 while 循环
【发布时间】:2014-07-31 00:14:43
【问题描述】:

当用户键入“exit”或“quit”时,我正在尝试创建一个 while - do 循环以退出。由于某种我无法理解的原因,我根本无法做到这一点。如果我分别应用这些条件之一,它就可以正常工作,但我需要同时满足这两个条件。

我在网上搜索,发现了几个不同编程语言的例子,例如,(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 memory!\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() */

【问题讨论】:

  • 69: error: expected expression before ‘)’ token 和线75: error: missing terminating " character
  • || 更改为&amp;&amp;。将其读作:“在 msg 未退出且退出未退出时继续”。
  • @clcto 你能把你的评论编辑成“......而且味精没有退出”吗? (+1 评论)
  • @David 您只能编辑 cmets 5 分钟,这已经是很久以前的事了。但你是对的,这显然是一个错字。

标签: c loops do-while


【解决方案1】:

试试:

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

你想要NOT (A OR B),而不是NOT A OR NOT B。记住De Morgan's lawsNOT (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

【讨论】:

  • 更改 || 是对的到 && 它确实有效。我的印象是我需要满足两个条件之一才能退出循环,这就是我使用 || 的原因。代替 &&。感谢您的时间和精力。现在有道理了,根据您的更新,我能够理解我的错误。再次感谢。 :D
【解决方案2】:

它不起作用,因为你想do循环while字符串与"exit"不同并且字符串与“不同”退出”。

如果您使用OR,条件将始终为真,因为字符串不能同时具有两个值。

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));

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 你是对的,它确实通过改变 || (or) 条件到 && (and)。我认为满足这两个条件之一就是我所需要的。我没有考虑使用 && 因为我必须同时满足这两个条件,但它工作得很好。感谢您的时间和精力。
    【解决方案4】:

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

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

    【讨论】:

    • 删除对strcmp 的调用是错误的。 ((*ptr_record).msg != "exit") 不比较字符串,它只是比较指针。
    猜你喜欢
    • 1970-01-01
    • 2022-10-14
    • 2018-06-23
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 2013-09-29
    • 2018-02-08
    • 1970-01-01
    相关资源
    最近更新 更多