关于Scanf的一些问题

fei*_*ueh 1 c scanf

接下来的三个代码之间有什么区别.

1:

struct node
{
    int data;
}tree[100050];
/*
some codes
*/
int main()
{
    int tot;
    scanf("%d",&tot);
    int tmp;
    for(int i=0;i<=tot;++i){
        scanf("%d",&tmp);
        tree[i].data=tmp;
        insert(i,1);
    }
}
Run Code Online (Sandbox Code Playgroud)

错误的答案

2:

struct node
{
    int data;
}tree[100050];
/*
some codes
*/
int main(){
    int n;
    scanf("%d",&n);
    int tmp;
    for(int i=0;i<=n;++i){
        scanf("%d",&tree[i].data);
        insert(i,1);
    }
}
Run Code Online (Sandbox Code Playgroud)

公认

3:

struct node
{
    int data;
}tree[100050];
/*
some codes
*/
int main()
{
    int tot;
    scanf("%d",&tot);
    int tmp;
    for(int i=0;i<=tot;++i){
        scanf("%d",&tmp);
        tree[i].data=tmp;
        insert(i,1);
        tmp=0;
    }
}
Run Code Online (Sandbox Code Playgroud)

公认

第一个代码无法通过所有测试,但接下来的两个代码可以通过所有测试.

问题出在这里POJS024.它是用中文写的.输入是构建二进制排序树的数字列表,第一个数字是根.输出有序遍历和后序遍历.

R S*_*ahu 5

这三个都使用错误的逻辑.你在第二个和第三个中幸运,可能是因为insert有一些特殊的值等于0的处理.

这三个中的错误就是你正在使用

for(int i=0;i<=n;++i){
Run Code Online (Sandbox Code Playgroud)

代替

for(int i=0;i<n;++i){
             ^^^ Needs to be < not <=
Run Code Online (Sandbox Code Playgroud)

如果您有代码来检查返回值scanf,那么您很快就会发现错误.

if ( scanf(...) == 1 )
{
    insert(i,1);
}
Run Code Online (Sandbox Code Playgroud)

这就是为什么你养成检查scanf函数族的返回值的习惯,这一点非常重要,以确保你能够读取你期望的所有数据.