C 无法识别代码错误,测试用例失败

C 无法识别代码错误,测试用例失败,c,C,我必须提交此代码作为解决方案。对于给定的测试用例,我的代码运行得非常完美,但我无法提交,因为代码未能通过解算器中的一个测试。如果可以的话,请帮忙。感谢您的帮助 带数字的礼品 许多顾客喜欢上面刻有数字的礼品,他们开始购买这些礼品作为生日和周年纪念的礼物。一位顾客来为他母亲的25周年结婚纪念日买礼物,另一位顾客来为他儿子的18岁生日买礼物。他们失望地看到礼品上只刻了个位数 看到这种礼品的狂热,Nisha批量订购了上面刻有两位数的礼品。包裹是在她忙的时候寄来的,她4岁的儿子开始把新到的东西放在架子上陈

我必须提交此代码作为解决方案。对于给定的测试用例,我的代码运行得非常完美,但我无法提交,因为代码未能通过解算器中的一个测试。如果可以的话,请帮忙。感谢您的帮助

带数字的礼品

许多顾客喜欢上面刻有数字的礼品,他们开始购买这些礼品作为生日和周年纪念的礼物。一位顾客来为他母亲的25周年结婚纪念日买礼物,另一位顾客来为他儿子的18岁生日买礼物。他们失望地看到礼品上只刻了个位数

看到这种礼品的狂热,Nisha批量订购了上面刻有两位数的礼品。包裹是在她忙的时候寄来的,她4岁的儿子开始把新到的东西放在架子上陈列。但是他把所有的东西都倒过来了。她需要改变物品的方向

但令她惊讶的是,她发现一些两位数的数字在双向阅读时是有效的。[例如,68倒读将是89,这也是一个有效的数字]帮助Nisha识别所有这样的2位数字

测试用例

输入1

十八

产出1

输入2

46

产出2

没有

投入3

a4

产出3

无效输入

C代码:

#include<stdio.h>
#include<ctype.h> 
#include<string.h>
int main()
{    

char str[2];

scanf("%s",str);

int flag=0;


if (strlen(str)!=2)
{
    flag=2;goto label;
}
else if (str[1]=='0')
{
    flag=1;goto label;
}

for(int i=0;i<2;i++)
{

    if(isdigit(str[i]))
    {
        if((str[i]!='0')&&(str[i]!='1')&&(str[i]!='6')&&(str[i]!='8')&&
    (str[i]!='9'))
        {
        flag=1;break;
        }

    }
    else 
    {flag=2;break;}

    }

label:
if (flag==0) printf("YES");
else if (flag==1) printf("NO");
else if (flag==2) printf("Invalid Input");
return 0;
}
评估后的结果如下:


程序的输出不正确,例如4a,因为您在检查第一个数字后中断循环


当程序应为无效输入时,程序的回答为否。

代码的主要问题是以下两行

char str[2];

scanf("%s",str);
当scanf输入/转换说明符为%s时,函数将向输入附加NUL'\0'字符,直到遇到空白字符,输入才会停止

空白:空格、制表符、换行符序列

因此,在使用“%s”输入/转换说明符时,有两个注意事项:

输入缓冲区必须比允许的最大输入字符数多1个字符 必须使用MAX_CHARACTERS修饰符,即比输入缓冲区的长度小1。 因此,这两条线应该是:

    char str[3];     // allows room for 2 characters plus NUL terminator

    scanf("%2s",str); // only allow user to input two characters
但是,代码还有一些其他问题

这一行:

    if (strlen(str)!=2)
    for( int i=0; i<2; i++ )
不允许只有一位数字,即1…9(包括在内)

使用goto+标签序列是一种非常糟糕的编程实践。它总是导致“意大利面”代码

此代码块:

    else if (str[1]=='0')
    {
        flag=1;
        goto label;
    }
不正确,因为它拒绝10、20、30、40、50、60、70、80、90。注意:在C中,数组索引的范围为0…比数组中的条目数少一个注意:“0”是十六进制的0x30,NUL终止符是十六进制的0x00

这一行:

    if (strlen(str)!=2)
    for( int i=0; i<2; i++ )

但是,当用户输入包含1个可逆数字和1个不可逆数字时,或者当任何用户输入不是数字时,上述代码段都不会处理。我会让你提供适当的逻辑。上面的内容应该可以让您从正确的方向开始。

您可以尝试下面的代码

#include<stdio.h>
#include<string.h>
void main(){
char str[2];
int a,b;
scanf("%s",str);
a=str[0];
b=str[1];
if(strlen(str)!=2)
printf("Invalid Input");
else if(str[0]=='0')
printf("NO");
else if((a>47&&a<58)&&(b>47&&b<58))
{
    if(((str[0]=='1')||(str[0]=='6')||(str[0]=='8')||(str[0]=='9'))&&((str[1]=='1')||(str[1]=='6')||(str[1]=='8')||(str[1]=='9')))
    printf("YES");
    else
    printf("NO");
}
else
printf("Invalid Input");

}

请记住,C中的字符串实际上称为以null结尾的字符串。这种终止使字符串成为字符串。这意味着一个包含两个字符的字符串需要有一个包含三个字符的数组,以适合终止符。现在在str数组的上下文中考虑它。尝试一些您自己的测试用例。您显示它通过了6个测试中的5个,但只显示了3个输入。你能把其他三个输入加起来吗?谢谢。这是一个失败的测试用例。谢谢你的观点。我对编码比较陌生。这些错误中的一些是为了尝试找出我遗漏的测试用例。解释为什么他可以使用这个用法,而没有尝试,你可以或不可以