快崩溃了,调了一个小时感觉是灵异事件

P1055 [NOIP2008 普及组] ISBN 号码

boringhen @ 2023-10-24 13:04:31

#include <bits/stdc++.h>
using namespace std;

int main()
{
    char arr[9],a,c;
    int b;
    scanf("%c-%c%c%c-%c%c%c%c%c-%c",&arr[0],&arr[1],&arr[2],&arr[3],&arr[4],&arr[5],&arr[6],&arr[7],&arr[8],&a);
    for(int i=0;i<9;i++)
    {
        b +=(i+1)*(arr[i]-48);
    }
    b %=11;
    if( b<10 )
    {
        c = b+48;
    }
    else
    {
        c = 'X';
    }
    if(a==c)
    {
        cout <<"Right";
    }
    else
    {
        printf("%c-%c%c%c-%c%c%c%c%c-%c",arr[0],arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],c);
    }
    system("pause");
return 0;
}

//在b %=11后,b会正常的等于4,问题出在b到c的转化的时候,如果用if语句让c=b+48的话c就会诡异的等于9,输出时又变成8,然而如果去掉if直接让c=b+48的话,c又会正常的等于4,是不是代码之神生气了罚我这个bug


by CooooldWind_ @ 2023-10-24 13:13:10

这边建议重构:Ctrl+A Del


by silverleo @ 2023-10-24 13:19:22

int b=0;

变量没有赋初值,代码之神确实有点生气了吧


by 2021zjhs005 @ 2023-10-24 13:21:34

添加一行 b=0,或者放在 int main() 前面作为全局变量自动清零。

若是局部变量(在 int main 里面),则变量会是一个随机值,用来累加的变量一定要清零。


by boringhen @ 2023-10-24 13:26:30

@silverleo 加上去果然ac了,感谢!


by boringhen @ 2023-10-24 13:28:49

@2021zjhs005 加上去果然ac了,感谢!不过我还有一点点不懂的地方,为什么最开始不清零可以正常运行,到了转化的地方才突然变成随机值,我debug的过程中发现累加是正常运行的,但一转化b马上就变成一个随机值了


by Azote @ 2023-10-24 13:31:39

@boringhen 他会找一个地址存b,你不赋值的话原来地址上是什么b就是什么


by AC_love @ 2023-10-24 13:31:45

把变量定义在 main() 函数里是个很不吉利的事(确信

反正很多新手都犯过和你类似的错误,建议还是定义成全局变量


by only_a_speaker @ 2023-10-24 13:36:25

您好,当你定义局部变量时,请赋初值。

全局变量之所以“不需要赋初值”,并非不需要初值,而是天然被赋为 0


by ShadowWalker @ 2023-10-24 13:40:33

对于局部变量来说,不赋值时它会是随机数,所以尽量要用全局变量,这样它就会自动赋值为0


by boringhen @ 2023-10-24 13:44:16

@AC_love 我们程序设计的老师说尽量不要使用全局变量,应该是从实际项目而不是竞赛的角度考虑的,我还在纠结这个习惯问题


| 下一页