#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
struct record
{
char name[20];
char number[20];
}NumberInfo[500];//通讯录列表
int NO;
int j;
FILE *fp;
void main(){
NO=10;
for(int i =0;i<10;i++){
NumberInfo[i].name = "张三";//给联系人赋值
NumberInfo[i].number="13701234567";
}
sort();
find();
}
void sort()//排序
{
int i,j;
struct record s;
int flag=1;
for(i=0;i<NO-1&&flag;i++){
flag=0;
for(j=NO-2;j>=i;j--){
if(strcmp(NumberInfo[j].name,NumberInfo[j+1].name)>0){
s=NumberInfo[j];
NumberInfo[j]=NumberInfo[j+1];
NumberInfo[j+1]=s;
flag=1;
}
}
}
}
void find(){//查找
char i;
char shuru[20];
j=0;
printf("请输入你要查找的用户名\n");
if(scanf("%c",&i)!='\0'){//及时根据输入查询联系人
shuru[j]=i;
j++;
found(shuru);
}
}
void found(char s[]){
for(int i=0;i<NO;i++){
if(strstr(NumberInfo[i].name,s)!=NULL){
printf("%s: %s\n",NumberInfo[i].name,NumberInfo[i].number);
}
}
printf("%s",s);
}
想问一下,这是什么问题?该怎么解决?
在C语言中,不支持这种对数组的直接赋值,因为数组表示一段内存,而不是一个变量。所以需要使用相关的函数把字符串(同样对应着一段内存)的内容复制到该数组对应 的内存中,如:
strcpy(NumberInfo[i].name, "张三");
strcpy(NumberInfo[i].number, "13701234567");
若你的字符串不需要改变,可以使用char*(字符指针)来代替字符数组,如const char *name,这样就可以这样使用
name = "张三";
因为字符指针是一个指针变量,可以指向"张三"这一段的内存。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#include<conio.h>
struct record
{
char name[20];
char number[20];
}NumberInfo[500];//通讯录列表
int NO;
int j;
FILE *fp;
void sort();
void find();
int main(){
NO=10;
for(int i =0;i<10;i++){
char name[] = "张三";
char telnum[] = "13701234567";
strcpy(NumberInfo[i].name, name); //给联系人赋值
strcpy(NumberInfo[i].number, telnum);
}
sort();
find();
}
void sort()//排序
{
int i,j;
struct record s;
int flag=1;
for(i=0;i<NO-1&&flag;i++){
flag=0;
for(j=NO-2;j>=i;j--){
if(strcmp(NumberInfo[j].name,NumberInfo[j+1].name)>0){
s=NumberInfo[j];
NumberInfo[j]=NumberInfo[j+1];
NumberInfo[j+1]=s;
flag=1;
}
}
}
}
void found(char s[]);
void find(){//查找
char i;
char shuru[20];
j=0;
printf("请输入你要查找的用户名\n");
if(scanf("%c",&i)!='\0'){//及时根据输入查询联系人
shuru[j]=i;
j++;
found(shuru);
}
}
void found(char s[]){
for(int i=0;i<NO;i++){
if(strstr(NumberInfo[i].name,s)!=NULL){
printf("%s: %s\n",NumberInfo[i].name,NumberInfo[i].number);
}
}
printf("%s",s);
}
因为是局部变量,你得用参数或者全局变量才能传过来。找一本入门的书先学习下!
sort,find函数需要前置申明,不然main调用的时候找不到。
NumberInfo[i].name = "张三";
NumberInfo[i].number = "13701234567";
应当变成:
strcpy(NumberInfo[i].name, "张三");
strcpy(NumberInfo[i].number, "13701234567");
#include
#include
#include
#include
struct record
{
char name[20];
char number[20];
}NumberInfo[500];
int NO;
FILE fp;
int loadfile();
void savefile();//保存
void menu();//菜单
void found();//创建
void modifymenu();//修改
void deleted();//删除
void display();//显示
void find();//查找
void main()
{
loadfile();
while (1)//////////////
menu();
}
int loadfile()/创建文件、读取文件*/
{
FILE fp;
if((fp=fopen("NumberInfo.txt","r"))==0)
{
printf("\n\n\n\n\n\t\t\t电话簿文件不存在");
if((fp=fopen("NumberInfo.txt","wb"))==0)//////////////////////////以二进制读取方式打开文件NumberInfo.txt
{
printf("\n\t\t\t\t建立失败");
exit(0);
}
else
{
printf("\n\n\t\t\t电话簿已建立");
printf("\n\n\t\t\t按任意键进入主菜单");
getch();/////////////////////////不回显读取函数,无需回车
NO=0;
return(NO);
}
exit(0);///////////////////////////////////////
}
fseek(fp,0,2);/从NumberInfo.txt文档中导入联系人(将当前指针移动到文件尾偏移0字节处)*/
if(ftell(fp)>0)
{
rewind(fp);
for(NO=0;!feof(fp)&&fread(&NumberInfo[NO],sizeof(struct record),1,fp);NO++);//feof()函数判断指针是否已到达文件尾,是返回1;fread()函数是读取文件内容到NumberInfo【】中;
printf("\n\n\n\n\n");
printf("\n\t\t文件导入成功!");
printf("\n\n\t\t\t\t按任意键返回主菜单");
getch();
return(NO);
}
else
{
printf("\n\t\t没有可以访问的数据!");
printf("\n\n\t\t\t按任意键返回主菜单进行添加");
getch();
NO=0;
return(NO);
}
}
void menu()/*主菜单*/
{
int choice;
system("cls");/*清屏*/
printf("\n\n\t********************欢迎使用通讯录系统***********************\n");
printf("\n\t\t *********创建通讯录请按:1**********\n");
printf("\n\t\t *********显示通讯录请按:2**********\n");
printf("\n\t\t *********修改通讯录请按:3**********\n");
printf("\n\t\t *********查找通讯录请按:4**********\n");
printf("\n\t\t *********退出通讯录请按:5**********\n");
printf("\n\t *********************这是通讯录的主菜单************************\n");
printf("\n\n\t\t请输入你的选择[]\b\b");
scanf("%d",&choice);
switch (choice)
{
case 1:found();break;
case 2:display();break;
case 3:modifymenu();break;
case 4:find();break;
case 5:system("cls");
printf("\n\n\n\n\n\n\n\t\t 谢谢使用此通讯录管理系统!\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
exit(0);
default :menu();
}
}
void found()/*创建通讯录*/
{
system("cls");
printf("\n\t\t********************请输入联系人信息**************************\n");
printf("\n\t\t输入姓名:");
scanf("%s",&NumberInfo[NO].name);
printf("\n\t\t输入电话号码:");
scanf("%s",&NumberInfo[NO].number);
NO++;
savefile();
printf("\n\t\t是否继续添加?(y/n):[]\b\b");
if (getch()=='y')
found();
else
system("cls");
printf("\n\n\n\n\n\n\n\n\t\t\t已成功保存所有联系人\n\n\t\t\t请按任意键返回主菜单");
getch();
}
void savefile()/*保存通讯录*/
{
int i;
if ((fp=fopen("NumberInfo.txt","wb"))==0)
printf("\n\t\t文件打开失败!\n");
for(i=0;i<NO;i++)
if(fwrite(&NumberInfo[i],sizeof(struct record),1,fp)!=1)
printf("\n\t\t写入文件错误!\n");
fclose(fp);
}
void display()/*显示通讯录*/
{
int i;
system("cls");
if(NO!=0)
{
printf("\n\t\t*****************以下为通讯录所有信息*******************");
for(i=0;i<NO;i++)
{
printf("\n\n\t\t%d",i+1);
printf("\n\t\t姓名: %s",NumberInfo[i].name);
printf("\n\t\t电话号码: %s",NumberInfo[i].number);
}
printf("\n\t\t********************************************************");
printf("\n\n\t\t\t 请按任意键返回主菜单进行添加");
getch();
menu();
}
else
{
printf("\n\n\n\n\n\n\n\n\n\t\t\t该通讯录暂无信息");
printf("\n\n\t\t\t 请按任意键返回主菜单进行添加");
getch();
menu();
}
}
void modifymenu()/*修改通讯录*/
{
int mark=0;
int i,k;
int a=0;
int t=0;
char choice;
char name[20];
struct record modify;
system("cls");
if(NO!=0)
{
printf("\n\n\n\t\t以下为所有联系人姓名:\n\n");
printf("\t\t********************************************************\n\n");
for(i=1;i<=NO;i++)
{
printf("\t\t%s\n",NumberInfo[i-1].name);
}
printf("\n\t\t*******************************************************\n");
printf("\n\t\t请输入您要修改的姓名:");
scanf("%s",name);
system("cls");
for(i=a;i<NO;i++)
{
if(strcmp(NumberInfo[i].name,name)==0)
{
k=i;
mark=1;
modify=NumberInfo[i];
system("cls");
printf("\n\t\t***********以下是您将修改的联系人信息************");
printf("\n\n\t\t姓名:%s",NumberInfo[i].name);
printf("\n\t\t联系电话: %s",NumberInfo[i].number);
printf("\n\n\t\t是否继续?(y/n)[]\b\b");
if (getch()=='n')
menu();
else
{
printf("\n\t\t选择您要修改的选项:");
printf("\n\n\t\t(1)姓名");
printf("\n\n\t\t(2)电话号码");
printf("\n\n\t\t(3)返回\n\n");
choice=getch();
switch(choice)
{
case'1':printf("\n\t\t请输入姓名:");
scanf("%s",NumberInfo[i].name);
break;
case '2':printf("\n\t\t\t请输入联系电话:");
scanf("%s",&NumberInfo[i].number);
break;
case '3':modifymenu();
break;
default:modifymenu();
}
system("cls");
printf("\n\t\t您的修改结果为:");
printf("\n\n\t\t 姓名: %s",NumberInfo[i].name);
printf("\n\t\t电话号码: %s",NumberInfo[i].number);
printf("\n\n\t\t确认修改?(y/n)[]\b\b");
if(getch()=='n')
{
NumberInfo[i]=modify;
printf("\n\t\t修改未保存!\n");
}
else
{
printf("\n\t\t修改成功!\n");
savefile();
}
mark++;
printf("\n\t\t是否继续修改?(y/n)[]\n");
if(getch()=='y')
modifymenu();
else menu();
}
}
}
}
if(mark==0)
{
printf("\n\n\n\t\t\t\t没有该联系人的记录");
printf("\n\n\t\t\t\t是否继续修改?(y/n)[]\b\b");
if(getch()=='y')
modifymenu();
}
else
{
printf("\n\n\n\n\n\n\n\n\n\t\t\t通讯录中无任何记录");
printf("\n\n\t\t\t 请按任意键返回主菜单进行添加");
getch();
menu();
}
}
void deleted()/*删除联系人*/
{
int i,j;
int mark=0;
char name[20];
system("cls");
if(NO!=0)
{
printf("\n\n\n\t\t以下为所有联系人的姓名:\n\n");
printf("\t\t*****************************************************\n\n");
for(i=1;i<=NO;i++)
{
printf("\t\t%s\n",NumberInfo[i-1].name);
}
printf("\n\t\t****************************************************\n");
printf("\n\t\t请输入要删除的联系人的姓名:");
scanf("%s",name);
system("cls");
for(i=0;i<NO;i++)
{
if(strcmp(NumberInfo[i].name,name)==0)
{
printf("\n\t\t以下是您要删除的联系人记录:");
printf("\n\n\t\t姓名: %s",NumberInfo[i].name);
printf("\n\t\t电话号码: %s",NumberInfo[i].number);
printf("\n\n\t\t是否删除?(y/n)[]\b\b");
if(getch()=='y')
{
for (j=i;j<NO-1;j++)
NumberInfo[j]=NumberInfo[j+1];
NO--;
mark++;
printf("\n\t\t删除成功\n");
savefile();
printf("\n\t\t是否继续删除?(y/n)[]\b\b");
if (getch()=='y')
deleted();
else
menu();
}
else
menu();
}
continue;
}
if (mark==0)
{
printf("\n\n\n\t\t\t\t没有该联系人记录");
printf("\n\n\t\t\t\t是否继续修改?(y/n)[]\b\b");
if(getch()=='y')
deleted();
}
}
else
{
printf("\n\n\n\n\n\n\n\n\n\t\t\t 通讯录中无任何记录");
printf("\n\n\t\t 请按任意键返回主菜单进行添加");
getch();
menu();
}
}
void find(){
int i,j;
i=0;
char shuru[20];
printf("请输入你要查找的用户名\n");
if(scanf("%c",&shuru[i])!='\0'){//及时根据输入查询联系人
i++;
for(int j=0;j<NO;j++){
if(strstr(NumberInfo[j].name,shuru)!=NULL){
printf("%s: %s\n",NumberInfo[j].name,NumberInfo[j].number);
}
}
printf("%s",shuru);
}
}
请问为什么这样还是不行?