するとエラーが出なかったので喜び勇んで実行したのですが・・・・・・
結果は空欄の結果がずっと表示される中にぽつんと
No-8564211012
氏名:フフフフフフフフがgきあ
年齢:フフフフフフ
といったようなものが一つあるだけになってしまいます。
環境はvisual studio2013 C++
言語はC言語です。
以下ソースです。
► スポイラーを表示
//標準入出力
#include<stdio.h>
//標準文字操作
#include <string.h>
//住所録表示用構造体
typedef struct{
//住所録ナンバー
int No;
//住所録氏名
char Name[40];
//住所録年齢
int Age;
//住所録電話番号
char Phone_number[40];
//住所録住所
char Address[200];
}disp_t;
/***********************************************************************/
//機能:値を入力し、構造体配列へ順次保存していく
//引数:
//戻り値:
//備考:
/***********************************************************************/
int Input(disp_t *disp,int *c){
/* 変数の宣言と初期化 */
//正常終了検知用フラグ
int End_flg = 0;
//終了確認メニュー選択用変数
int menu_end = 0;
//確認メニュー選択用変数
int menu = 0;
//名前格納用変数
char name[80];
//年齢格納用変数
int age;
//電話番号格納用変数
char phone_num[80];
//住所格納用変数
char address[400];
/* 処理部 */
//入力開始
//入力画面の案内
printf("\n");
printf("入力画面です\n");
//致命的なエラーでない限りループ
while(End_flg == 0){
//breakが返されるまでループ
do{
//氏名入力
printf("氏名を入力してください:");
scanf("%s",&name);
//入力された文字が40バイト以上だった場合
if(strlen(name) > 40){
//エラーメッセージを表示する
printf("入力された文字が多すぎます!\n");
//do-while文のループを抜ける
break;
}
//年齢入力
printf("年齢を整数で入力してください:");
if(scanf("%d",&age) != 1){
//エラーメッセージを表示する
printf("整数で入力してください!\n");
//do-while文のループを抜ける
break;
}
//電話番号入力
printf("電話番号を入力してください:");
scanf("%s",&phone_num);
//入力された文字が40バイト以上だった場合
if(strlen(name) > 40){
//エラーメッセージを表示する
printf("入力された文字が多すぎます!\n");
//do-while文のループを抜ける
break;
}
//住所入力
printf("住所を入力してください:");
scanf("%s",&address);
//入力された文字が200バイト以上だった場合
if(strlen(name) > 200){
//エラーメッセージを表示する
printf("入力された文字が多すぎます!\n");
//do-while文のループを抜ける
break;
}
//確認
printf("保存する住所録No%dは\n",*c + 1);
printf("氏名 :%s\n",name);
printf("年齢 :%d\n",age);
printf("電話番号:%s\n",phone_num);
printf("住所 :%s\n",address);
printf("でよろしいですか?\n");
printf("1:はい\n");
printf("2:いいえ\n");
printf("選択してください:");
scanf("%d",&menu);
//はいの場合
if(menu == 1){
//構造体に各変数の数値を代入していく
disp[*c].No = *c + 1;
strcpy(disp[*c].Name, name);
disp[*c].Age = age;
strcpy(disp[*c].Phone_number,phone_num);
strcpy(disp[*c].Address,address);
//代入が成功したので、データ数カウンタをインクリメントする
(*c) ++;
}
//いいえの場合
if(menu == 2){
//do-while文のループを抜ける
break;
}
//動作終了の案内
printf("正常に終了しました\n");
//全体ループを終了する
End_flg = 1;
break;
}while(0);
//終了検知フラグが立っているか判定
if(End_flg != 1){
while(1){
//入力画面を終了するか選択
printf("入力画面を終了しますか?\n");
printf("1:はい\n");
printf("2:いいえ\n");
//正しい整数が入力されたか判定
if(scanf("%d",&menu_end) != 1 || menu_end > 1 || menu_end < 2){
//エラーメッセージを表示
printf("正しい整数を入力してください\n");
}
else{
//while文のループから抜ける
break;
}
}
//はいを選んだ場合
if(menu_end == 1){
//while文の終了条件をだす
End_flg = 1;
}
}
}
//関数を終了する
return 0;
}
/***********************************************************************/
//機能:読み込んだ値を表示するための関数を呼び出す
//引数:
//戻り値:
//備考:
/***********************************************************************/
int Disp(disp_t *disp,disp_t *tmp,int *c){
/* 変数の宣言と初期化 */
//ソート用変数
int x,y;
//正常終了検知用フラグ
int End_flg = 0;
//メニュー選択用変数
int menu = 0;
//終了判定用変数
int menu_end = 0;
//for文用の変数
int i = 0;
/* 処理部 */
//表示画面の案内
printf("\n");
printf("表示画面です\n");
//致命的なエラーでない限りループ
while(End_flg == 0){
//breakが返されるまでループ
do{
//No順か、名前順かの選択
printf("No順か名前順か選択できます\n");
printf("1:No\n");
printf("2:名前\n");
printf("モード:");
//1~2の整数で入力されたか判定
if(scanf("%d",&menu) != 1 || menu < 1 || menu > 2){
//エラーメッセージを表示する
printf("1~2の整数で入力してください\n");
//do-while文のループを抜ける
break;
}
//表示できるデータがあるか判定
//ない場合
if(*c <= 0){
//エラーメッセージを表示
printf("ERROR!\n");
printf("表示できるデータが一つもありません!\n");
//do-while文のループを抜ける
break;
}
//ある場合
else{
//No順を選択した場合
if(menu == 1){
//住所録をNo順にソート
for(x = 0;x < *c - 1;x ++){
for(y = x + 1;y < x;y ++){
if(disp[x].No > disp[y].No){
*tmp = disp[x];
disp[x] = disp[y];
disp[y] = *tmp;
}
}
}
//住所録を全て表示
for(i = 0;i < *c;i ++){
printf("\n");
printf("No :%d\n",disp[i].No);
printf("氏名 :%s\n",disp[i].Name);
printf("年齢 :%d\n",disp[i].Age);
printf("電話番号:%s\n",disp[i].Phone_number);
printf("住所 :%s\n",disp[i].Address);
printf("\n");
}
}
//名前順を選択した場合
if(menu == 2){
//名前順にソート
for(x = 0;x < *c - 1;x ++){
for(y = x + 1;y < x;y ++){
if(strcmp(disp[x].Name,disp[y].Name) > 0){
*tmp = disp[x];
disp[x] = disp[y];
disp[y] = *tmp;
}
}
}
//住所録を全て表示
for(i = 0;i < *c;i ++){
printf("\n");
printf("No :%d\n",disp[i].No);
printf("氏名 :%s\n",disp[i].Name);
printf("年齢 :%d\n",disp[i].Age);
printf("電話番号:%s\n",disp[i].Phone_number);
printf("住所 :%s\n",disp[i].Address);
printf("\n");
}
}
}
//関数を終了する
break;
End_flg = 1;
}while(0);
//終了検知フラグが立っているか判定
if(End_flg != 1){
while(1){
//入力画面を終了するか選択
printf("入力画面を終了しますか?\n");
printf("1:はい\n");
printf("2:いいえ\n");
//正しい整数が入力されたか判定
if(scanf("%d",&menu_end) != 1 || menu_end < 1 || menu_end > 2){
//エラーメッセージを表示
printf("正しい整数を入力してください\n");
}
else{
//while文のループから抜ける
break;
}
}
//はいを選んだ場合
if(menu_end == 1){
//while文の終了条件をだす
End_flg = 1;
}
}
}
//動作終了の案内
printf("正常に終了しました\n");
//関数を終了する
return 0;
}
/***********************************************************************/
//機能:構造体内のデータをファイルに保存する
//引数:
//戻り値:
//備考:
/***********************************************************************/
int File_Save(disp_t *disp,int *c){
/* 変数の宣言と初期化 */
//ファイル名用文字列配列
char file_name[200];
//for文用変数の宣言
int i = 0;
//ファイルポインタの作成
FILE *fp;
/* 処理部 */
//保存画面の案内
printf("\n");
printf("保存画面です\n");
printf("現在PCに保持されている住所録のデータをファイルに自動的に保存します\n");
//ファイル名の入力の案内
printf("ファイル名を入力してください\n");
//ファイル名の入力
printf("ファイル名:");
scanf("%s",file_name);
//バイナリファイル形式で試す
//ファイルをオープンする
fp = fopen(file_name,"wb");
//存在しない、又は作成不可能な場合
if(fp == NULL){
//テキストファイル形式で試す
//ファイルをオープンする
fp = fopen(file_name,"r");
//存在しない、又は作成不可能な場合
if(fp == NULL){
//エラーメッセージを表示する
printf("ERROR!\n");
printf("ファイルをオープンできません!");
//異常だと判断し"1"を返す
return 1;
}
//存在する場合
else{
for(i = 0;i < *c;i ++){
//ここに記述
}
}
}
//存在する場合
else{
//データをファイルに保存する
fwrite(disp,sizeof(disp_t),1000,fp);
//カウンタ数をファイルに保存する
fwrite(&c,sizeof(int),1,fp);
}
//ファイルを閉じる
fclose(fp);
//動作終了の案内
printf("正常に終了しました\n");
//関数を終了する
return 0;
}
/***********************************************************************/
//機能:ファイルを読み込み、構造体内に順次保存していく
//引数:
//戻り値:
//備考:・入力関数にて一度も入力を行わず、ファイルの読込を行った場合
// 読み込んだ回数をデータ保持のカウンタの値にする
// ・入力されているデータがあるにも関わらず、ファイルの読込を行った場合
// 確認メッセージ"PC内に保持されているデータは削除されます"を表示する
/***********************************************************************/
int File_Load(disp_t *disp,disp_t *disp_tmp,int *c){
/* 変数の宣言と初期化 */
//読み取りカウンタ数一時保存用変数
int c_tmp;
//モード選択用変数
int mode = 0;
//ファイル名用文字列配列
char file_name[200];
//確認メッセージ用変数
int sta = 0;
//for文用変数の宣言
int i = 0;
//ファイルポインタの作成
FILE *fp;
/* 処理部 */
//読込画面の案内
printf("\n");
printf("読込画面です\n");
printf("現在ファイルに保存されている住所録のデータを読み込みます\n");
//モード選択の案内
printf("上書きか追加かを選択してください\n");
printf("1:上書き\n");
printf("2:追加\n");
//モードの選択
printf("モード:");
scanf("%d",&mode);
//ファイル名の入力の案内
printf("ファイル名を入力してください\n");
//ファイル名の入力
printf("ファイル名:");
scanf("%s",file_name);
//バイナリファイル形式で試す
//ファイルをオープンする
fp = fopen(file_name,"rb");
//存在しない場合
if(fp == NULL){
//テキストファイル形式で試す
//ファイルをオープンする
fp = fopen(file_name,"r");
//存在しない、又は作成不可能な場合
if(fp == NULL){
//エラーメッセージを表示する
printf("ERROR!\n");
printf("ファイルをオープンできません!");
//異常だと判断し"1"を返す
return 1;
}
////存在する場合
//else{
//
// for(i = 0;i < *c;i ++){
//
// //テキスト形式ファイルだと断定し、一時保存用構造体に値を代入していく
// fscanf(fp,"%lu,",&);
// }
//
//}
}
//存在する場合
else{
//表示用構造体に書き込む
fread(disp_tmp,sizeof(disp_t),1000,fp);
//上書きモード
if(mode == 1){
//カウンタ数を更新する
fread(c,sizeof(int),1,fp);
//表示用構造体の内容を更新する
for(i = 0;i < 1000;i ++){
disp[i].No = disp_tmp[i].No;
strcpy(disp[i].Name,disp_tmp[i].Name);
disp[i].Age = disp_tmp[i].Age;
strcpy(disp[i].Phone_number,disp_tmp[i].Phone_number);
strcpy(disp[i].Address,disp_tmp[i].Address);
}
}
//追加モード
if(mode == 2){
//カウンタ数を持ってくる
fread(&c_tmp,sizeof(int),1,fp);
//カウンタ数を更新する
(*c) = (*c) + c_tmp;
//表示用構造体の内容を更新する
for(i = *c;i < 1000;i ++){
disp[i].No = (disp_tmp[i - *c].No) + *c;
strcpy(disp[i].Name,disp_tmp[i - *c].Name);
disp[i].Age = disp_tmp[i - *c].Age;
strcpy(disp[i].Phone_number,disp_tmp[i - *c].Phone_number);
strcpy(disp[i].Address,disp_tmp[i - *c].Address);
}
}
}
//ファイルを閉じる
fclose(fp);
//動作終了の案内
printf("正常に終了しました\n");
//関数を終了する
return 0;
}
/***********************************************************************/
//機能:メニューにて機能を選択し、任意の機能を動作させる
//引数:
//戻り値:
//備考:
/***********************************************************************/
void main(void){
/* 変数の宣言と初期化 */
//for文用変数
int i;
//エラー判定用変数
int e = 0;
//メニュー選択用変数
int menu = 0;
//データ数カウント用変数
int count = 0;
//住所録表示用構造体の初期化
disp_t disp[100] = {0,0,0,0,0};
disp_t disp_tmp[100] = {0,0,0,0,0};
disp_t tmp;
/* 処理部 */
while(menu != 6){
//必要な領域を動的確保
//メニュー内容表示
printf("\n");
printf("住所録です\n");
printf("1:入力\n");
printf("2:表示\n");
printf("3:ファイル保存\n");
printf("4:ファイル読込\n");
printf("5:データ変更\n");
printf("5:終了\n");
//メニュー選択の案内
printf("メニューを選択してください:");
//入力した数字が整数で0より大きく、5より小さいか判定
if(scanf("%d",&menu) != 1 || menu > 6 || menu < 1){
//エラーメッセージを表示
scanf("%*[^\n]");
printf("ERROR!\n");
printf("1~6の整数を入力してください!\n");
}
//入力された整数が正しい場合
else{
//メニューの数字から関数を呼び出し
switch(menu){
//1を選択した場合
case 1 :
//入力関数を呼び出し、返り値が1だった場合
if((e = Input(disp,&count)) == 1){
//while文の終了条件をmenuに代入する
menu = 6;
}
//switch文のループを抜ける
break;
//2を選択した場合
case 2 :
//表示関数を呼び出す
if((e = Disp(disp,&tmp,&count)) == 1){
//while文の終了条件をmenuに代入する
menu = 6;
}
//switch文のループを抜ける
break;
//3を選択した場合
case 3 :
//保存関数を呼び出し、返り値が1だった場合
if((e = File_Save(disp,&count)) == 1){
//while文の終了条件をmenuに代入する
menu = 6;
}
//switch文のループを抜ける
break;
//4を選択した場合
case 4 :
//読込関数を呼び出し、返り値が1だった場合
if((e = File_Load(disp,disp_tmp,&count)) == 1){
//while文の終了条件をmenuに代入する
menu = 6;
}
//switch文のループを抜ける
break;
//case 5 :
//
// //変更関数を呼び出し、返り値が1だった場合
// if((e = Change(disp,&count)) == 1){
//
// //while文の終了条件をmenuに代入する
// menu = 6;
//
// }
//
// //switch文のループを抜ける
// break;
//1~6以外の数字を選択した場合
default :
//switch文のループを抜ける
break;
}
}
}
//終了の案内
printf("プログラムを終了します\n");
//.exeをダブルクリックで起動した時に、自動でウィンドウが消えないようにする
return;
}
アドバイスをいただきたいです。
おねがいします!