c - scanf使while循环自动运行2次

标签 c while-loop scanf

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

厨师开发了自己的下棋计算机程序。他还处于起步阶段。首先,他需要编写模块来接收玩家编写的 Action 并对其进行分析。该模块将接收一个字符串,它应该首先报告该字符串是否代表棋盘上正确的单元对(我们称此类字符串为正确),然后根据棋盘上的情况报告它是否代表正确的移动。大厨在分析骑士的招式时总是遇到困难。因此,首先他需要一个测试程序,可以判断给定的字符串是否正确,然后判断它是否代表正确的马走法(无论棋盘上的情况如何)。棋盘上的单元格表示为两个字符的字符串:第一个字符是从 a 到 h 的小写拉丁字母,第二个字符是从 1 到 8 的数字。该字符串表示棋盘上的正确单元格对,如果它由 5 个字符组成,其中前两个字符代表棋子所在的单元格,第三个字符是破折号“-”,最后两个字符代表目标单元格。 输入 第一行包含一个整数 T <= 50000,测试用例的数量。 T 测试用例如下。每个测试用例中唯一的一行包含一个由 32 到 126 的 ASCII 码字符组成的非空字符串。该字符串的长度不大于 10。 输出 对于每个测试用例,如果相应的字符串不代表棋盘上正确的单元格对,则输出包含单词“Error”的单行。否则,如果这对单元格代表正确的骑士 Action ,则输出"is",否则输出“否”。 例子 输入: 4 a1-b3 d2-h8 a3 c4 错误错误

输出: 是的 不 错误 错误

#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;
}

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

最佳答案

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

关于c - scanf使while循环自动运行2次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31638042/

相关文章:

c - 如何在其自己的 SIGCHLD 处理程序中获取设置进程的 PID?

c - SunRPC 启用单向消息传递(流/批处理?)

C:组合 while 和 if 语句

c - 如何读取未知文件中的数字、字母和符号?

C 的 scanf 函数。如果使用宽度修饰符,例如 : %5d. 如何防止用户输入的任何多余数字被读入下一个 %d 说明符?

c++ - C/C++ Hook 来访问程序的窗口元素

c - 添加到单链表末尾 段错误 C

c - While 循环条件不满足

bash - 如何将 grep 重定向到 while 循环

c - 如何在 C 中解析几乎定义的字符串?