scanf("%s",&person[i].job)与scanf("%s",person[i].job)的区别

来源:互联网 发布:kali linux安装到手机 编辑:程序博客网 时间:2021/10/28 21:22
//请对比以下两个程序段,认真分析其因

#include 
<stdio.h>
#include 
<string.h>
struct score
{
    
char job[10];
    union
    
{
        
int classes;
        
char group[20];
    }
category;
}
person[2];

void main()
{
    
int i;    
    
for(i=0;i<2;i++)
    
{        
        scanf(
"%s",person[i].job);//结构体变量person是数组,因此必须以%s作输入格式符,又因其成员job也是字符数组,所以输入项前不必加取地址运算符&
        if(strcmp(person[i].job,"s")==0)        
            scanf(
"%d",&person[i].category.classes);        
        
else if(strcmp(person[i].job,"t")==0)
            scanf(
"%s",person[i].category.group);//结构体变量person是数组,因此必须以%s作输入格式符,又因其成员group又是共用体变量category中的字符数组,所以输入项前不必加取地址运算符&    
        else
            printf(
"input error!");
    }

    
for(i=0;i<2;i++)
    
{
        
if(strcmp(person[i].job,"s")==0)
            printf(
"%d,",person[i].category.classes);
        
else
            printf(
"%s",person[i].category.group);
    }

}



//程序段二:
#include <stdio.h>
#include 
<string.h>
struct score
{
    
char job;
    union
    
{
        
int classes;
        
char group[20];
    }
category;
}
person[2];

void main()
{
    
int i;    
    
for(i=0;i<2;i++)
    
{        
        scanf(
"%s",&person[i].job);//因为结构体变量person是数组,所以必须用%s作格式符,又因为其成员仅是字符型变量而非数组,所以应该加上取地址运算符&.(注意:此语句并不茅盾)
        if(person[i].job=='s')        
            scanf(
"%d",&person[i].category.classes);        
        
else if(person[i].job=='t')
            scanf(
"%s",person[i].category.group);//必须用%s作格式符,但不能加取地址运算符&.因为结构体变量person是数组,而其成员group是共用体category变量中的字符数组    
        else
            printf(
"input error!");
    }

    
for(i=0;i<2;i++)
    
{
        
if(person[i].job=='s')    
            printf(
"%d,",person[i].category.classes);
        
else
            printf(
"%s",person[i].category.group);
    }

}

 

scanf("%s",&person[i].job);//如果person是数组,job是字符变量则此语句不茅盾,且输入时必须用%s作格式符,并要加上取地址运算符&

scanf("%s",person[i].job);//如果person和job都是数组,且job为字符数组,只输入是不需要取地址运算符&