无法通过代码识别错误,导致测试用例失败

时间:2017-05-27 17:30:05

标签: c

我必须提交此代码作为解决方案。我的代码完全针对给定的测试用例运行,但由于代码在解算器中的某个测试失败,我无法提交。如果可以的话请帮忙。任何帮助表示赞赏。

带数字的礼品

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

看到这种礼品的热潮,Nisha批量订购了刻有2位数字的礼品。包裹在她忙碌时到达,她4岁的儿子开始将新到的物品安排在架子上展示。但他把所有物品都颠倒了。她需要改变物品的方向。

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

测试用例

输入1

18

输出1

YES

输入2

46

输出2

NO

输入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;
}

评估后的输出如下:

output

3 个答案:

答案 0 :(得分:2)

该程序的输出不正确,例如对于TypeTag[T],因为在检查完第一个数字后你会跳出循环。

该程序的答案为4a,应为NO

答案 1 :(得分:0)

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

char str[2];

scanf("%s",str);

scanf()输入/转换说明符为&#34;%s&#34;然后该函数将NUL(&#39; \ 0&#39;)字符附加到输入,并且在遇到white space字符之前不会停止输入。

空格:空格,制表符,换行符序列

因此,使用&#39;%s&#34;输入/转换说明符有两个注意事项:

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

        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)
    
    当只有一个数字时,

    不允许。 1 ... 9包含。

    使用goto +标签序列是一种非常糟糕的编程习惯。它在意大利面条中不变的结果是&#39;代码。

    此代码块:

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

    不正确,因为它拒绝10,20,30,40,50,60,70,80,90。注意:在C中,数组索引的范围是0 ...(比数字少一个数组中的条目)注意:&#39; 0&#39;是十六进制的0x30,NUL终结符是十六进制的0x00。

    这一行:

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

    假设所有的年龄都是&#39;是2位数字。这不包括1至9岁的年龄。建议:

        for( size_t i=0; i<=strlen(str); i++ )
    

    注意:strlen()返回size_t,而不是int,并将索引返回给NUL字符

        flag = 2;  // initialize to indicate invalid input
        if( strlen( str ) )
        { // then some characters entered by user
    
            for( size_t i=0; i<strlen( str ); i++ )
            {
                ... // check for invertible digit 
                ... // check for non digit 
            }
        }
    
        switch( flag )
        {
            case 0:
                printf( "YES\n" );
                break;
    
            case 1:
                printf( "NO\n" );
                break;
    
            default:
                printf( "Invalid Input\n" );
                break;
        } // end switch
    
        // Note: on modern C compilers, 
        // when the returned value from 'main()' is always 0, 
        // then no 'return 0;' statement actually needed
        return 0;
    } // end function: main
    

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

答案 2 :(得分:-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");

}