我刚开始学习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停止”时停止程序。感谢。
答案 0 :(得分:3)
完整工作守则:
#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
。替换它,它应该工作。另外,c
是string
,因此,您必须使用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()
。