关于Scanf的一些问题

时间:2016-02-05 06:34:31

标签: c scanf

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

1:

Ex:
Class POJO{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
------
@GeneratedValue(strategy = GenerationType.IDENTITY)
-----
@GeneratedValue(strategy = GenerationType.TABLE)
------
(or Any other best approch?)
}

错误答案

2:

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

接受

3:

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

接受

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

而不是

for(int i=0;i<n;++i){
             ^^^ Needs to be < not <=

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

if ( scanf(...) == 1 )
{
    insert(i,1);
}

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

答案 1 :(得分:2)

问题(在所有三种情况下实际上都存在)是因为您在{{1}中使用了scanf()比较,因此您拨打<=的次数太多了}循环而不是使用for比较。结果,对<的最后一次调用实际上失败了。然后再打电话给scanf()一次。

在示例1中,insert(i,1)被设置为读入tree[i].data的最后一个值,在示例2和3中,值保留为零。显然,对tmp的额外调用在该特定情况下不会导致问题。