如何根据用户在C中的输入停止程序

时间:2013-12-23 06:47:10

标签: c

我刚开始学习C而且我在根据用户输入的内容停止我的程序时遇到问题。

#include <stdio.h>
#include <stdbool.h>
int main()
{
int a;
int b;
char c[5];
printf("Enter the two values you like to compare, type stop to end.\n");
while (c != "stop")
{
    scanf_s(" %d %d %s", &a, &b, &c);
    if (!(a^b))
    {
        printf("both are equal\n");
        getchar();
    }
    else
    {
        printf("both are not equal\n");
        getchar();
    }
}
printf("Thanks for playing.");
getchar();
return 0;   
} 

我遇到的问题是必须在我的scanf_s中输入另一个变量c。我该怎么做才能让用户不必在2个数字之后输入另一个单词?另外,我如何检查用户是否只输入“停止”以便它将停止程序?顺便说一下,我现在的方式也不会在“10 10停止”时停止程序。感谢。

6 个答案:

答案 0 :(得分:3)

  1. 删除&amp;对于scanf_s中的c(“%d%d%s”,&amp; a,&amp; b,&amp; c);
  2. 使用strcmp来比较字符串。
  3. 如果在比较使用strcasecmp(对于基于UNIX的系统)和stricmp(对于windows)时需要忽略大小写。
  4. 如果您需要至少运行一次循环,请使用do-while而不是while。
  5. 完整工作守则:

    #include <stdio.h>
    #include <string.h>
    int main()
    {
      int a;
      int b;
      char c[5] = {'\0'};
    
      do {
        printf("Enter the two values you like to compare, type stop to end.\n");
        scanf("%d%d%s", &a, &b, c);
        if (!(a^b))
          {
        printf("both are equal\n");
        getchar();
          }
        else
          {
        printf("both are not equal\n");
        getchar();
          }
      }
      while (strcmp(c,"stop"));
      printf("Thanks for playing.");
      getchar();
      return 0;   
    }
    

答案 1 :(得分:2)

while (c != "stop")

您无法比较C中的strings,使用memcmp()中提供的strncmp()string.h库函数。阅读它们以了解它们如何在while循环中实现为条件。

另外,要获取字符串输入,请使用
scanf_s(" %d %d %s", &a, &b, c); // Remove that litle '&' before 'c'.

注意:函数scanf_s返回正确扫描的输入数,您应该在继续输入值之前检查它。

要让用户在没有明确输入“停止”的情况下停止,有许多方法:

1)使用do-while循环并不断询问用户是否要玩更多。
2)使用负数输入(比如-1)退出。

答案 2 :(得分:1)

使用下面的行确保您的'c'扫描输入的字符串。

  

scanf(“%d%d%s”,&amp; a,&amp; b,c);

编辑: 考虑用下面的行替换你的while,以确保你停止工作。包括“string.h”

while (strcmp(c,"stop"))

答案 3 :(得分:1)

这是固定版本......我已在代码中添加注释以便理解......

#include <stdio.h>
#include <string.h>
int main()
{
    int a;
    int b;
    char c[5] = {'\0'};
    printf("Enter the two values you like to compare, type stop to end.\n");
    while (strcmp(c,"stop"))
    {
        scanf("%d%d%s", &a, &b, c);
        if (!(a^b))
        {
            printf("both are equal\n");
            getchar();
        }
        else
        {
            printf("both are not equal\n");
            getchar();
        }
    }
    printf("Thanks for playing.");
    getchar();
    return 0;   
} 

答案 4 :(得分:1)

这是因为您在&c中使用c而非scanf_s。替换它,它应该工作。另外,cstring,因此,您必须使用strcmp而不是!=

编写此代码的更简单方法是::

int main()
{
int a;
int b;
char c;
do
{
    printf("Would you like to play?\nPress 'Y' for 'Yes' or 'N' for 'No'\n");
    scanf( "%c", &c ) ;
    /*scanf_s( "%c", &c, 1 ) ; */
    if( c != 'Y' && c != 'y' )
        break ;

    printf("Enter the two values you like to compare\n" ) ;
    scanf(" %d %d", &a, &b);
    if (!(a^b))
    {
        printf("both are equal\n");
        getchar();
    }
    else
    {
        printf("both are not equal\n");
        getchar();
    }
}while(1) ;
printf("Thanks for playing.");
getchar();
return 0;   
} 

答案 5 :(得分:1)

首先,让我们纠正你的程序: &c(scanf_s的第三个参数)不正确。它应该是c(因为它已经是指针)。根据文档,scanf_s requires sizes to be specified表示所有%s格式字符串;因此,你现在的工作方式,你应该写scanf_s(" %d %d %4s", &a, &b, c);

如果您将逻辑更改为“输入空白行以退出”,则程序将更容易使用。你可以测试一下scanf_s的返回值,它将是从输入中正确读取的格式字符串的数量。

如果需要要求输入字符串,则允许其中任何一个,并查看用户编写的内容以查看它是数字还是字符串:

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

int main()  {
    int a;
    int b;
    char c[32];
    printf("Enter the two values to compare, or type stop to end.\n");
    while (fgets(c, 31, stdin) != NULL && strncmp("stop\n", c)) != 0) {

        // user did not request to exit and wrote something; maybe 2 numbers
        if (sscanf(c, "%d %d", &a, &b) != 2) {
            // but he did not write two numbers. Complain and repeat.
            printf("please write two numbers to compare, or type stop to end.\n");
            continue; 
        }

        if (a == b) {
            printf("both are equal\n");
        } else  {
            printf("both are not equal\n");
        }
    }
    printf("Thanks for playing.\n");
    return 0;   
} 

fgets读取整行,然后您可以尝试使用sscanf解析它们。这比普通scanf更有优势,您可以尝试以不同的方式解析同一行,具体取决于您在其中找到的内容。通常,您希望用getchar()填充您的代码。如果您正在调试,您的调试器将停止。如果您没有进行调试,则需要使用input redirection测试或使用您的程序,而根本不需要getchar()