c语言 给结构体变量赋值时候出问题,请帮我看看
/*建立一个通讯录(包括姓名,出生日期,性别,电话号码),可以录入信息和查找信息*/
#include<stdio.h>
#include<string.h>
typedef struct
{
int year;
int month;
int day;
}BIRTHDAY;
typedef struct
{
char name[20];
BIRTHDAY b;
char sex[10];
long tele;
}DATA;
DATA CREATE();//新建一个朋友的通讯信息
int command();//选择操作存(0),查(1),退出(2)
DATA check(DATA S[],int n);//通过姓名在存有n个通讯信息的列表中查找
void PRINT(DATA s);//在屏幕显示通讯录
void main()
{
DATA S[100],CHECK;
printf("请输入第0个空通讯录的用户名:");
gets_s(S[0].name);
printf("\n");
int n=0;
int c;
//选择命令
c=command();
while(1)//通过无限循环命令控制输入和查找
{
if(c==0)
{
S[n+1]=CREATE();
n++;
c=command();
}
if(c==1)
{
CHECK=check(S,n);
//打印输出查找到得通讯信息
PRINT(CHECK);
c=command();
}
if(c==2)
break;
}
}
DATA CREATE()//新建一个朋友的通讯信息
{
DATA t;
printf("\nplease input name:");
scanf_s("%s",t.name);
printf("\nplease input birthday year:");
scanf_s("%d",&t.b.year);
printf("\nplease input birthday month:");
scanf_s("%d",&t.b.month);
printf("\nplease input birthday day:");
scanf_s("%d",&t.b.day);
printf("\nplease input sex:");
scanf_s("%s",t.sex);
printf("\nplease input telephone number:");
scanf_s("%ld",&t.tele);
return t;
}
int command()//选择操作存(0),查(1),退出(2)
{
int c;
printf("选择操作存(0),查(1),退出(2):");
scanf_s("%d",&c);
printf("\n");
return c;
}
DATA check(DATA S[],int n)//通过姓名在存有n个通讯信息的列表中查找
{
int i,j,k;
char a[20];
printf("请输入要查找的人的名字(以‘#’结束):");
gets_s(a);
printf("\n");
for(i=1;i<n+1;i++)
{
j=0;k=0;
while(a[j]!='#')
{
if(a[j]==S[i].name[j])
k++;
}
if(k==strlen(a))
return S[i];
}
printf("没有%s的通讯信息\n",a);
return S[0];
}
void PRINT(DATA s)//在屏幕显示通讯录
{
printf("姓名:%s\n生日:%d年%d月%d日\n性别:%s\n电话号码:%d",s.name,s.b.year,s.b.month,s.b.day,s.sex,s.tele);
}
S[100]是预设的一个结构体,S[0]不保存通讯数据,从S[1]开始赋值,运行到31行时候while无线循环里面 输入姓名后马上就中断或出错,请问怎么改,哪里出错了
[解决办法]
scanf_s,参数中可以加个数值,限制长度吧。可能你的
[解决办法]
ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内在泄露。所以vc++2005/2008中提供了scanf_s(),在调用时,必须提供一个数字以表明最多读取多少位字符。
1. 将scanf_s修改为scanf
2. 指定读取多少个字符。
[解决办法]
// 654151.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "stdafx.h"
#include "string.h"
#include "stdio.h"
#define DENSITY 62.4
#include <iostream>
using namespace std;
class A
{
public:
void virtual f()
{
cout<<"A"<<endl;
}
};
class B:public A
{
public:
void virtual f()
{
cout<<"B"<<endl;
}
};
#include<stdio.h>
#include<string.h>
typedef struct
{
int year;
int month;
int day;
}BIRTHDAY;
typedef struct
{
char name[20];
BIRTHDAY b;
char sex[10];
long tele;
}DATA;
DATA CREATE();//新建一个朋友的通讯信息
int command();//选择操作存(0),查(1),退出(2)
DATA check(DATA S[],int n);//通过姓名在存有n个通讯信息的列表中查找
void PRINT(DATA s);//在屏幕显示通讯录
void main()
{
DATA S[100],CHECK;
printf("请输入第0个空通讯录的用户名:");
gets_s(S[0].name);
printf("\n");
int n=0;
int c;
//选择命令
c=command();
while(1)//通过无限循环命令控制输入和查找
{
if(c==0)
{
S[n+1]=CREATE();
n++;
c=command();
}
if(c==1)
{
CHECK=check(S,n);
//打印输出查找到得通讯信息
PRINT(CHECK);
c=command();
}
if(c==2)
break;
}
}
DATA CREATE()//新建一个朋友的通讯信息
{
DATA t;
printf("\nplease input name:");
scanf("%s",t.name);
printf("\nplease input birthday year:");
scanf("%d",&t.b.year);
printf("\nplease input birthday month:");
scanf("%d",&t.b.month);
printf("\nplease input birthday day:");
scanf("%d",&t.b.day);
printf("\nplease input sex:");
scanf("%s",t.sex);
printf("\nplease input telephone number:");
scanf("%ld",&t.tele);
return t;
}
int command()//选择操作存(0),查(1),退出(2)
{
int c;
printf("选择操作存(0),查(1),退出(2):");
scanf("%d",&c);
printf("\n");
return c;
}
DATA check(DATA S[],int n)//通过姓名在存有n个通讯信息的列表中查找
{
int i,j,k;
char a[20];
printf("请输入要查找的人的名字(以‘#’结束):");
gets_s(a);
printf("\n");
for(i=1;i<n+1;i++)
{
j=0;k=0;
while(a[j]!='#')
{
if(a[j]==S[i].name[j])
k++;
}
if(k==strlen(a))
return S[i];
}
printf("没有%s的通讯信息\n",a);
return S[0];
}
void PRINT(DATA s)//在屏幕显示通讯录
{
printf("姓名:%s\n生日:%d年%d月%d日\n性别:%s\n电话号码:%d",s.name,s.b.year,s.b.month,s.b.day,s.sex,s.tele);
}