我是初学者。我想写一个程序,它会猜出一个用户选择的数字。一般来说,用户在给定限度内选择一个数字,程序会在同一限制内生成一个随机数,询问用户是否正确的数字,Y / N答案,程序读取它,然后询问用户是否' s数字更大或更小,读取答案并将此信息传递给另外两个函数。
(我还没有完成那些,但是想法是它将剩下的数字分成2,再问一次,再大一点,再把它再分2,依此类推,直到我们得到答案。)
问题是,即使我使用char类型的最简单数组,我也无法使其工作。计算机的答案是,如果我没有为其中一个阵列预留足够的内存。
我在本书的数组主题中还有两章,我只是想写这个程序。我在这里使用的是迄今为止我所学到的,所以如果可能的话,在你的答案中不要使用任何更复杂的C函数和功能。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
int bigger(int number, int limit);
int lower(int number, int limit);
int main(void) {
system("COLOR B0");
const int Hlimit=100;
const int Llimit=0;
char alowwed_answer[]={'>','<'};
char answer[2];
char alowwed_answerYN[]={'Y', 'N'};
char answerYN[2];
srand((unsigned)time(NULL));
int numberTOguess;
printf("\r\nEnter your number from %i to %i, "
"and I will try to guess!: ",Llimit,Hlimit);
while(scanf("%i",&numberTOguess) )
{
int check=rand()%Hlimit;
printf("\r\nyour number is - %i Y/N?",check);
scanf("%c",&answerYN[0]);
printf("answer is %c\r\n", answerYN);//this line is for checking;
int check_answ=strcmp(answerYN[0],alowwed_answerYN[0]);
printf("check answer is %i",check_answ);//this line is for checking;
if(check_answ==0)
{
printf("I did it!");
break;
}
else if(strcmp(answerYN[0],alowwed_answerYN[1])==0)
{
printf("\r\nyour number is bigger '>' or smaller '<'?: ");
scanf("%c",&answer);
if(strcmp(answer[0],alowwed_answer[0])==0)
{
bigger(check, Hlimit);
}
else if(strcmp(answer[0],alowwed_answer[1])==0)
{
lower(check, Llimit);
}
}
}
printf("\r\nI did it!");
return 0;
}
int bigger(int number, int limit)
{
printf("it is bigger!");//I will finish this part as soon as I will get first part working.
return 0;
}
int lower(int number, int limit)
{
printf("it is lower!!!");//I will finish this part as soon as I will get first part working.
return 0;
}
谢谢,我接受了您的建议,并将声明类型更改为SWITCH。但它仍然无法正常工作。不知何故,嵌套开关根本不起作用。
查看代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
int bigger(int number, int limit);
int lower(int number, int limit);
int main(void) {
system("COLOR B0");
const int Hlimit=100;
const int Llimit=0;
char answerBL;
char answerYN;
srand((unsigned)time(NULL));
int numberTOguess;
printf("\r\nEnter your number from %i to %i, "
"and I will try to guess!: ",Llimit,Hlimit);
while(scanf("%i",&numberTOguess) )
{
int check=rand()%Hlimit;
printf("\r\nyour number is - %i Y/N?",check);
scanf("%c",&answerYN);
switch(answerYN)
{
case 'Y':
printf("I did it!");
break;
case 'N':
printf("\r\nOk, your number is bigger '>' or smaller '<'?: ");
scanf("%c",&answerBL);
switch(answerBL)
{
case '>':
bigger(check, Hlimit);
break;
case'<':
lower(check, Llimit);
break;
}
default:
printf("Y or N?");
}
}
printf("\r\nEND!");
return 0;
}
int bigger(int number, int limit)
{
printf("it is bigger!");
return 0;
}
int lower(int number, int limit)
{
printf("it is lower!!!");
return 0;
}
问题解决了,我找到了原因以及如何解决它。在这里,来自另一个主题
基本问题是scanf()在缓冲区中的数字后面留下换行符,然后在下一遍中用%c读取它。实际上,这很好地说明了为什么我不使用scanf();我使用行读取器(例如fgets())和sscanf()。它更容易控制。
你可以使用&#34;来拯救它。 %C&#34;而不是&#34;%c&#34;格式字符串。在读取字符之前,空白会导致scanf()跳过空格(包括换行符)。
但从长远来看,放弃scanf()和fscanf()以及使用fgets()或等效的加sscanf()会更容易。除此之外,当你使用整个字符串时,错误报告会更容易,而不是scanf()失败后留下的小插图。
您还应始终检查是否获得了从scanf()转换的值。输入失败 - 经常和可怕。不要让它破坏你的程序,因为你没有检查。
3月5日回复,12月7日5点回复 乔纳森莱弗勒
答案 0 :(得分:2)
函数strcmp
期望两个指针作为参数,指向 以null结尾 字节字符串的第一个字符的指针。
用例如
strcmp(answerYN[0],alowwed_answerYN[0]);
你有两个主要问题:
数组answerYN
(部分)未初始化,其内容(也部分)不确定。这意味着answerYN[1]
可能不是所需的字符串终止符。
alowwed_answerYN[0]
是单个char
,而不是指向字符串的指针。这应该会给您一个关于无效转换或类似内容的警告。
如果您只想比较字符,请使用==
中的正常比较answerYN[0] == alowwed_answerYN[0]
。
或者为什么不完全跳过alowwed_answerYN
并明确地使用answerYN[0] == 'Y'
中的显式字符文字。这比使用'Y'
和'N'
的数组更清晰。