【问题标题】:scanf making while loop to run 2 times automaticallyscanf 使 while 循环自动运行 2 次
【发布时间】:2015-07-26 14:23:14
【问题描述】:

当我输入输入时,scanf 会自动运行 while 循环 2 次 a3 c4?

Chef 开发了自己的下棋计算机程序。他在最开始。首先,他需要编写一个模块来接收玩家编写的动作并对其进行分析。模块会收到一个字符串,它首先应该报告这个字符串是否代表棋盘上正确的一对单元格(我们称这样的字符串是正确的),然后根据棋盘上的情况报告它是否代表正确的移动。厨师总是难以分析骑士的动作。因此,首先他需要一个测试程序,可以判断给定的字符串是否正确,然后判断它是否代表正确的马移动(无论棋盘上的情况如何)。棋盘上的单元格表示为由两个字符组成的字符串:第一个字符是从 a 到 h 的小写拉丁字母,第二个字符是从 1 到 8 的数字。字符串表示棋盘上正确的一对单元格,如果它由 5 个字符组成,其中前两个字符代表国际象棋图所在的单元格,第三个字符是破折号“-”,最后两个字符代表目标单元格。 输入 第一行包含一个整数 T

输出: 是的 不 错误 错误

#include<stdio.h>
#include<string.h>
int main()
{
    int test;
    scanf("%d",&test);
    while(test--)
    {
        char str[11];
        scanf("%s[^\n]",str);
        int length=strlen(str);
        if(length>5 || length<5)
        {
            printf("Error\n");
        }
        else if(str[0]<97 || str[0]>104 || str[1]<49 || str[1]>57 || str[2]!=45 || str[3]<97 || str[3]>104 || str[4]<48 || str[4]>57)
        {
            printf("Error\n");
        }
        else
        {

            if(abs(str[0]-str[3])==1 && abs(str[1]-str[4])==2  ||  abs(str[0]-str[3])==2  ||abs(str[1]-str[4])==1)
            {
                printf("Yes\n");
            }
            else
            {
                printf("No\n");
            }
        }
    }
    return 0;
}

我该怎么做才能让它正常运行。

【问题讨论】:

  • %s[^\n] 应该是%10[^\n],并且在这样做之前您还需要清除输入缓冲区。
  • 为什么要测试 length&gt;5 || length&lt;5 而不是 length != 5,为什么要硬编码 ASCII 字符?你可以做else if(str[0] &lt; 'a')

标签: c while-loop scanf


【解决方案1】:

在您的测试用例中,您希望循环执行 4 次,它确实这样做了。 a3 c4 输入会产生两个错误,因为 scanf 只读取 a3(因为两者之间没有连字符),其余的则保留在缓冲区中以供下一次 scanf 使用。

【讨论】:

    【解决方案2】:
    char str[11];
    scanf("%s[^\n]",str);
    

    没有初始化?应该是

    char str[11];
    str[0] = 0;
    scanf("%s[^\n]",str);
    

    【讨论】:

    • 不,它会运行正确的次数。比如输入1,进入循环时会递减,不会第二次进入。
    猜你喜欢
    • 1970-01-01
    • 2014-12-18
    • 2011-11-02
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 2020-04-29
    相关资源
    最近更新 更多