数组和scanf函数一起工作的问题

时间:2017-11-01 06:56:46

标签: c arrays switch-statement printf scanf

我是初学者。我想写一个程序,它会猜出一个用户选择的数字。一般来说,用户在给定限度内选择一个数字,程序会在同一限制内生成一个随机数,询问用户是否正确的数字,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点回复   乔纳森莱弗勒

1 个答案:

答案 0 :(得分:2)

函数strcmp期望两个指针作为参数,指向 以null结尾 字节字符串的第一个字符的指针。

用例如

strcmp(answerYN[0],alowwed_answerYN[0]);

你有两个主要问题:

  1. 数组answerYN(部分)未初始化,其内容(也部分)不确定。这意味着answerYN[1]可能不是所需的字符串终止符。

  2. alowwed_answerYN[0]是单个char,而不是指向字符串的指针。这应该会给您一个关于无效转换或类似内容的警告。

  3. 如果您只想比较字符,请使用==中的正常比较answerYN[0] == alowwed_answerYN[0]

    或者为什么不完全跳过alowwed_answerYN并明确地使用answerYN[0] == 'Y'中的显式字符文字。这比使用'Y''N'的数组更清晰。