大神幫忙解決下,要求輸入的name必須是字母,否則重新輸入
uj5u.com熱心網友回復:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define N 20 //最大容量為15
typedef struct //定義一個結構
{
char name[10];
char haoma[15];
char leibie[10];
char dizhi[20];
}ren;
//選單
void menu() //目錄
{
system("cls"); //清屏
printf("歡迎使用手機通訊錄\n");
printf("\n");
printf("==========\n");
printf("1.號碼添加\n");
printf("2.號碼查詢\n");
printf("3.號碼修改\n");
printf("4.號碼洗掉\n");
printf("5.號碼撥號\n");
printf("0. 退出\n");
printf("==========\n");
printf("\n");
printf("自動1班\n");
printf("請選擇相應的功能:");
}
//號碼添加
void input()
{
FILE *fp; //定義檔案指標
ren ry,s; // 定義兩個ren結構體的量
int i,flag;
if((fp=fopen("ren.dat","ab+"))==NULL)
{printf("can't open file!\n");exit(0);}
printf("\n錄入格式 姓名 號碼 類別 郵箱。當輸入為#結束錄入\n");
while(1)
{
printf("請輸入姓名:");
scanf("%s",ry.name);
if(strcmp(ry.name,"#")==0) break; //如果輸入#則退出添加
for(i=0;i<=10;i++)
{
if('a'<=ry.name[i]<='z' || 'A'<=ry.name[i]<='Z')
flag=1;
else
flag=0;
}
if(flag==0)
{ printf("請輸入姓名:");
scanf("%s",ry.name);
if(strcmp(ry.name,"#")==0) break; } //如果輸入#則退出添加
else
printf("請輸入電話號碼:");
scanf("%s",ry.haoma);
if(strcmp(ry.haoma,"#")==0) break;
printf("請輸入類別(A辦公類B個人類C商務類):");
scanf("%s",ry.leibie);
if(strcmp(ry.leibie,"#")==0) break;
printf("請輸入郵箱地址:");
scanf("%s",ry.dizhi);
if(strcmp(ry.dizhi,"#")==0) break;
fseek(fp,0,0); //指標定位到檔案開始位置
fread(&s,sizeof(ren),1,fp);
while(!feof(fp))
{ if(strcmp(s.haoma,ry.haoma)==0)
{printf("號碼已經存在,不能記錄.\n");break;}//遇到有相同的號碼
fread(&s,sizeof(ren),1,fp);
}
if(feof(fp)) //讀到自后也沒有相同的號碼
fwrite(&ry,sizeof(ren),1,fp); //將資訊寫入檔案
}
fclose(fp); //關閉檔案
getchar(); //接受一個輸入
}
void search() //查詢
{
ren ry;
FILE *fp;
char leibie[10];
system("cls");
printf("\n輸入要查人員的類別: ");scanf("%s",leibie);//要查詢的類別
if((fp=fopen("ren.dat","rb"))==NULL) {printf("can't open file!\n");exit(0);}
fread(&ry,sizeof(ren),1,fp);
if(!feof(fp))
{ printf(" 人員的資訊如下:\n");
printf("說明:(A辦公類B個人類C商務類)");
printf("\n%10s %15s %10s %20s \n","姓名","號碼","類別","郵箱");
while(!feof(fp))
{
if(strcmp(ry.leibie,leibie)==0) //若為該類別則輸出
{
printf("%10s %15s %10s %20s \n",ry.name,ry.haoma,ry.leibie,ry.dizhi);
}
fread(&ry,sizeof(ren),1,fp);
}
}
else printf("查找失敗!!!");
fclose(fp);
getch();
}
//修改:輸入人員的姓名,查找該人員,若找到則修改該人員的資訊,并顯示修改前后的結果;
void modi()
{ ren ry;
FILE *fp;
char name[10];
system("cls");
if((fp=fopen("ren.dat","rb+"))==NULL) {printf("can't open file!\n");exit(0);}
if(!feof(fp))
{printf(" 修改前全部人員的資訊如下:\n");
printf("\n%10s %15s %10s %20s \n","姓名","號碼","類別","郵箱");
fread(&ry,sizeof(ren),1,fp);
while(!feof(fp))
{
printf("%10s %15s %10s %20s \n",ry.name,ry.haoma,ry.leibie,ry.dizhi);
fread(&ry,sizeof(ren),1,fp);
}
}
printf("\n輸入要修改人員的姓名: ");scanf("%s",name);
if((fp=fopen("ren.dat","rb+"))==NULL) {printf("can't open file!\n");exit(0);}
while(!feof(fp))
{ fread(&ry,sizeof(ren),1,fp);
if(strcmp(ry.name,name)==0)
{ printf(" 修改前人員的資訊如下:\n");
printf("\n%10s %15s %10s %20s \n","姓名","號碼","類別","郵箱");
printf("%10s %15s %10s %20s \n",ry.name,ry.haoma,ry.leibie,ry.dizhi);
printf("\n請輸入該人的號碼:");scanf("%s",ry.haoma);
printf("\n類別:");scanf("%s",ry.leibie); //新資訊輸入
printf("\n郵箱:");scanf("%s",ry.dizhi);
break; //修改完畢退出
}
}
if(!feof(fp))
{
printf(" \n 修改后的人的資訊如下:\n");
printf("\n%10s %15s %10s %20s \n","姓名","號碼","類別","郵箱");
printf("%10s %15s %10s %20s \n",ry.name,ry.haoma,ry.leibie,ry.dizhi);
fseek(fp,sizeof(ren),1); //指標向前一位定位
fwrite(&ry,sizeof(ren),1,fp);
}
else
printf("\n此人不存在,修改失敗!!");
fclose(fp);
getch();
}
//洗掉:輸入人員姓名,若該人員存在,則洗掉,并顯示洗掉后余下的人員的資訊
void dele()
{ ren ry[N];
FILE *fp;
char name[10];
int i,len,k=-1;
system("cls");
printf("\n輸入要洗掉的人員姓名: ");scanf("%s",name);
i=0;
if((fp=fopen("ren.dat","rb+"))==NULL) {printf("can't open file!\n");exit(0);}
while(!feof(fp))
{ fread(&ry[i],sizeof(ren),1,fp);
if(feof(fp)) break;
if(strcmp(ry[i].name,name)==0) k=i;
i++;
}
fclose(fp);
//以下是洗掉后重新寫檔案
len=i;
if(k>=0)
{ if((fp=fopen("ren.dat","wb+"))==NULL) {printf("can't open file!\n");exit(0);}
for(i=0;i<len;i++)
{ if(i==k) continue;
fwrite(&ry[i],sizeof(ren),1,fp);
}
fclose(fp);printf("洗掉成功!!!\n");
}
else printf("洗掉失敗!!!\n");
getch();
}
void bohao() //撥號
{ ren ry;
FILE *fp;
char name[10];
system("cls");
printf("\n輸入要撥人員的姓名: ");scanf("%s",name);
if((fp=fopen("ren.dat","rb"))==NULL) {printf("can't open file!\n");exit(0);}
while(!feof(fp))
{ fread(&ry,sizeof(ren),1,fp);
if(strcmp(ry.name,name)==0)
{ printf("\n\a\a\a\a\a\a %15s\a\a\a\a\a\n",ry.haoma); //輸出號碼和聲音
break;
}
}
if(feof(fp)) printf("撥號失敗!!!");
fclose(fp);
getch();
}
//選單選擇
void choice()
{
char ch;
while(1)
{
menu();// 顯示選單
ch=getch();//選擇選單
if(ch=='0') break;
switch(ch)//判斷功能項
{
case '1': input();break;
case '2':search();break;
case '3':modi();break;
case '4':dele();break;
case '5':bohao();break;
}
}
printf("\n歡迎使用!!!\n");
}
//主函式
void main()
{
choice();//呼叫選單選擇
}
uj5u.com熱心網友回復:
判斷name字串中的字符是否是a-z或者A-Z就可以啊,比如 char s[5] = "Tom";if(s[0]>='a'&&s[0]<='z' || s[0]>='A'&&s[0]<='Z')
uj5u.com熱心網友回復:
我試過,但是好像不可以,麻煩你幫我看看吧uj5u.com熱心網友回復:
我的qq:1261143898 姓名 :汪金生,可以幫幫我嗎?uj5u.com熱心網友回復:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
#define N 20 //最大容量為15
typedef struct //定義一個結構
{
char name[10];
char haoma[15];
char leibie[10];
char dizhi[20];
}
ren;
//選單
void menu() //目錄
{
system("cls"); //清屏
printf("歡迎使用手機通訊錄\n");
printf("\n");
printf("==========\n");
printf("1.號碼添加\n");
printf("2.號碼查詢\n");
printf("3.號碼修改\n");
printf("4.號碼洗掉\n");
printf("5.號碼撥號\n");
printf("0. 退出\n");
printf("==========\n");
printf("\n");
printf("自動1班\n");
printf("請選擇相應的功能:");
}
//號碼添加
void input() {
FILE *fp; //定義檔案指標
ren ry,s; // 定義兩個ren結構體的量
int i,flag;
if((fp=fopen("ren.dat","ab+"))==NULL) {
printf("can't open file!\n");exit(0);
}
printf("\n錄入格式 姓名 號碼 類別 郵箱。當輸入為#結束錄入\n");
while(1) {
while (1) {
printf("請輸入姓名:");fflush(stdout);
rewind(stdin);
fgets(ry.name,10,stdin);
if ('\n'==ry.name[strlen(ry.name)-1)]) ry.name[strlen(ry.name)-1)]=0;
if(strcmp(ry.name,"#")==0) break;
for (i=0;i<strlen(ry.name);i++) if (!isalpha(ry.name[i])) break;
if (i<strlen(ry.name)) {
printf("姓名必須是字母\n");
} else break;
}
if(strcmp(ry.name,"#")==0) break; //如果輸入#則退出添加
printf("請輸入電話號碼:");
scanf("%s",ry.haoma);
if(strcmp(ry.haoma,"#")==0) break;
printf("請輸入類別(A辦公類B個人類C商務類):");
scanf("%s",ry.leibie);
if(strcmp(ry.leibie,"#")==0) break;
printf("請輸入郵箱地址:");
scanf("%s",ry.dizhi);
if(strcmp(ry.dizhi,"#")==0) break;
fseek(fp,0,0); //指標定位到檔案開始位置
fread(&s,sizeof(ren),1,fp);
while(!feof(fp)) {
if(strcmp(s.haoma,ry.haoma)==0) {
printf("號碼已經存在,不能記錄.\n");break;
}//遇到有相同的號碼
fread(&s,sizeof(ren),1,fp);
}
if(feof(fp)) //讀到自后也沒有相同的號碼
fwrite(&ry,sizeof(ren),1,fp); //將資訊寫入檔案
}
fclose(fp); //關閉檔案
getchar(); //接受一個輸入
}
void search() //查詢
{
ren ry;
FILE *fp;
char leibie[10];
system("cls");
printf("\n輸入要查人員的類別: ");scanf("%s",leibie);//要查詢的類別
if((fp=fopen("ren.dat","rb"))==NULL) {
printf("can't open file!\n");exit(0);
}
fread(&ry,sizeof(ren),1,fp);
if(!feof(fp)) {
printf(" 人員的資訊如下:\n");
printf("說明:(A辦公類B個人類C商務類)");
printf("\n%10s %15s %10s %20s \n","姓名","號碼","類別","郵箱");
while(!feof(fp)) {
if(strcmp(ry.leibie,leibie)==0) //若為該類別則輸出
{
printf("%10s %15s %10s %20s \n",ry.name,ry.haoma,ry.leibie,ry.dizhi);
}
fread(&ry,sizeof(ren),1,fp);
}
} else printf("查找失敗!!!");
fclose(fp);
getch();
}
//修改:輸入人員的姓名,查找該人員,若找到則修改該人員的資訊,并顯示修改前后的結果;
void modi() {
ren ry;
FILE *fp;
char name[10];
system("cls");
if((fp=fopen("ren.dat","rb+"))==NULL) {
printf("can't open file!\n");exit(0);
}
if(!feof(fp)) {
printf(" 修改前全部人員的資訊如下:\n");
printf("\n%10s %15s %10s %20s \n","姓名","號碼","類別","郵箱");
fread(&ry,sizeof(ren),1,fp);
while(!feof(fp)) {
printf("%10s %15s %10s %20s \n",ry.name,ry.haoma,ry.leibie,ry.dizhi);
fread(&ry,sizeof(ren),1,fp);
}
}
printf("\n輸入要修改人員的姓名: ");scanf("%s",name);
if((fp=fopen("ren.dat","rb+"))==NULL) {
printf("can't open file!\n");exit(0);
}
while(!feof(fp)) {
fread(&ry,sizeof(ren),1,fp);
if(strcmp(ry.name,name)==0) {
printf(" 修改前人員的資訊如下:\n");
printf("\n%10s %15s %10s %20s \n","姓名","號碼","類別","郵箱");
printf("%10s %15s %10s %20s \n",ry.name,ry.haoma,ry.leibie,ry.dizhi);
printf("\n請輸入該人的號碼:");scanf("%s",ry.haoma);
printf("\n類別:");scanf("%s",ry.leibie); //新資訊輸入
printf("\n郵箱:");scanf("%s",ry.dizhi);
break; //修改完畢退出
}
}
if(!feof(fp)) {
printf(" \n 修改后的人的資訊如下:\n");
printf("\n%10s %15s %10s %20s \n","姓名","號碼","類別","郵箱");
printf("%10s %15s %10s %20s \n",ry.name,ry.haoma,ry.leibie,ry.dizhi);
fseek(fp,sizeof(ren),1); //指標向前一位定位
fwrite(&ry,sizeof(ren),1,fp);
} else
printf("\n此人不存在,修改失敗!!");
fclose(fp);
getch();
}
//洗掉:輸入人員姓名,若該人員存在,則洗掉,并顯示洗掉后余下的人員的資訊
void dele() {
ren ry[N];
FILE *fp;
char name[10];
int i,len,k=-1;
system("cls");
printf("\n輸入要洗掉的人員姓名: ");scanf("%s",name);
i=0;
if((fp=fopen("ren.dat","rb+"))==NULL) {
printf("can't open file!\n");exit(0);
}
while(!feof(fp)) {
fread(&ry[i],sizeof(ren),1,fp);
if(feof(fp)) break;
if(strcmp(ry[i].name,name)==0) k=i;
i++;
}
fclose(fp);
//以下是洗掉后重新寫檔案
len=i;
if(k>=0) {
if((fp=fopen("ren.dat","wb+"))==NULL) {
printf("can't open file!\n");exit(0);
}
for(i=0;i<len;i++) {
if(i==k) continue;
fwrite(&ry[i],sizeof(ren),1,fp);
}
fclose(fp);printf("洗掉成功!!!\n");
}
else printf("洗掉失敗!!!\n");
getch();
}
void bohao() //撥號
{ ren ry;
FILE *fp;
char name[10];
system("cls");
printf("\n輸入要撥人員的姓名: ");scanf("%s",name);
if((fp=fopen("ren.dat","rb"))==NULL) {
printf("can't open file!\n");exit(0);
}
while(!feof(fp)) {
fread(&ry,sizeof(ren),1,fp);
if(strcmp(ry.name,name)==0) {
printf("\n\a\a\a\a\a\a %15s\a\a\a\a\a\n",ry.haoma); //輸出號碼和聲音
break;
}
}
if(feof(fp)) printf("撥號失敗!!!");
fclose(fp);
getch();
}
//選單選擇
void choice() {
char ch;
while(1) {
menu();// 顯示選單
ch=getch();//選擇選單
if(ch=='0') break;
switch(ch)//判斷功能項
{
case '1': input();break;
case '2':search();break;
case '3':modi();break;
case '4':dele();break;
case '5':bohao();break;
}
}
printf("\n歡迎使用!!!\n");
}
//主函式
void main() {
choice();//呼叫選單選擇
}
uj5u.com熱心網友回復:
謝謝哥,可是幫里我大忙了uj5u.com熱心網友回復:
老師,再問一個問題,就是在整個程式結束之后,有一個自己存的通訊錄的.data檔案,里面全是亂碼,怎么回事?uj5u.com熱心網友回復:
你保存的二進制格式嗎?
uj5u.com熱心網友回復:
好像c語言的保存的都是二進制的吧uj5u.com熱心網友回復:
可以是txt文本格式的~
uj5u.com熱心網友回復:
求解,怎么保存的uj5u.com熱心網友回復:
電腦記憶體或檔案內容只是一個一維二進制位元組陣列及其對應的二進制地址;人腦才將電腦記憶體或檔案內容中的這個一維二進制位元組陣列及其對應的二進制地址的某些部分看成是整數、有符號數/無符號數、浮點數、復數、英文字母、阿拉伯數字、中文/韓文/法文……字符/字串、匯編指令、函式、函式引數、堆、堆疊、陣列、指標、陣列指標、指標陣列、陣列的陣列、指標的指標、二維陣列、字符點陣、字符筆畫的坐標、黑白二值圖片、灰度圖片、彩色圖片、錄音、視頻、指紋資訊、身份證資訊……
推薦使用WinHex軟體查看硬碟或檔案或記憶體中的原始位元組內容。
不要把
fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //讀時把\r\n替換成\n,寫時把\n替換成\r\n;讀到\x1a就設定EOF;讀寫的內容當字符看待
和
fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替換,遇到\x1a仍繼續讀;讀寫的內容當位元組看待
弄混了
uj5u.com熱心網友回復:
能說的,在具體一些嗎?轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/134126.html
標籤:界面
下一篇:右鍵選單不關閉如何實作!
