キャラデータを削除する部分のfor分が一回しか動いていないので困っています。
delete関数のcase2がキャラデータを削除する部分です。
キャラ番号1を削除すると入力した場合、
1,A 1:b 2:c 3:
2,B 1:e 2:f 3:
3,C 1:h 2:i 3:
4,D 1:k 2:l 3:
5,E 1:n 2:o 3:
となって欲しいのですが、
1,A 1:b 2:c 3:
2,B 1:d 2:e 3:f
3,C 1:g 2:h 3:i
4,D 1:j 2:k 3:l
5,E 1:m 2:n 3:o
となり、一回分しか処理できてないのです。
どう変えたらいいのか教えてください。
OSはwindows,コンパイラはgccです。
/*ファイルの取り込み*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*マクロ定義*/
#define max_data 100 //最大データ数の上限
#define max_item 100 //最大項目数の上限
#define max_word 50 //最大文字数の上限
/*グローバル変数宣言*/
struct Saved_data //保存されている全データをまとめる構造体
{
char item_name[max_word]; //item_name[(文字数)] この項目の名前
char data[max_data][max_word]; //data[(データ番号)][(文字数)] 各データのこの項目に対する内容
} item[max_item]; //item[(項目番号)] 各項目についての構造体
int max_data_number; //現在の全データ数
int max_item_number; //現在の全項目数
void output(){
if(max_item_number==0 && max_data_number==0){
printf("ALL DELETED\n");
}
for(int i=0;i<5;i++){
printf("%d,%s ",i+1,item[i].item_name); //項目番号と項目名
for(int j=0;j<3;j++){
printf("%d:%s ", j+1,item[i].data[j]); //各項目の各キャラのデータ
}
printf("\n");
}
}
void delete(int mode_delete){
int del_num;
int end=1;
switch (mode_delete){
case 1: //全データの削除
max_data_number = 0;
max_item_number = 0;
for(int a = 0; a < max_item; a++){
for(int b = 0; b < max_data; b++){
for(int c = 0; c < max_word; c++){
if(b == 0) item[a].item_name[c] = '\0';
item[a].data[b][c] = '\0';
}
}
}
break;
case 2: //1キャラ削除
while(end==1){
output();
while(1){
del_num=0;
printf("削除するキャラデータの番号を入力してください。\n");
scanf("%d",&del_num);
if(del_num>=1 && del_num<=max_data_number){
del_num=del_num-1;
break;
} else {
printf("無効な入力です。\n");
}
}
for(int j=0;j<max_item_number;j++){
for(del_num;del_num<max_data_number;del_num++){
strcpy(item[j].data[del_num],item[j].data[del_num+1]);
}
for(int r=0;r<=max_word;r++){
item[j].data[max_data_number][r]='\0';
}
}
max_data_number=max_data_number-1; //1キャラ削除の終わり
printf("他のキャラデータも削除しますか?\n"); //続行するか?
while(1){
printf("1:続行 2:終了\n");
scanf("%d",&end);
if(end!=1 && end!=2){
printf("無効な入力です。\n");
} else {
break;
}
}
}
case 3: //1項目の削除
while (end==1) {
output();
while(1){
del_num=0;
printf("削除する項目の番号を入力してください。\n");
scanf("%d",&del_num);
if(del_num>=0 && del_num<=max_item_number){
del_num=del_num-1;
break;
} else {
printf("無効な入力です。\n");
}
}
for(del_num;del_num<max_item_number;del_num++){
item[del_num]=item[del_num+1];
}
for(int s=0;s<=max_word;s++){
item[max_item_number].item_name[s]='\0';
}
for(int n=0;n<=max_data_number;n++){
for(int t=0;t<=max_word;t++){
item[max_item_number].data[n][t]='\0';
}
} //項目削除の終わり。
printf("他の項目も削除しますか?\n"); //続行するか?
while(1){
printf("1:続行 2:終了\n");
scanf("%d",&end);
if(end!=1 && end!=2){
printf("無効な入力です。\n");
} else {
break;
}
}
}
default:
break;
}
}
void input() {
max_data_number=3;
max_item_number=5;
/*koumoku*/
item[0].item_name[0]='A';
item[1].item_name[0]='B';
item[2].item_name[0]='C';
item[3].item_name[0]='D';
item[4].item_name[0]='E';
/*de-ta*/
item[0].data[0][0]='a';
item[0].data[1][0]='b';
item[0].data[2][0]='c';
item[1].data[0][0]='d';
item[1].data[1][0]='e';
item[1].data[2][0]='f';
item[2].data[0][0]='g';
item[2].data[1][0]='h';
item[2].data[2][0]='i';
item[3].data[0][0]='j';
item[3].data[1][0]='k';
item[3].data[2][0]='l';
item[4].data[0][0]='m';
item[4].data[1][0]='n';
item[4].data[2][0]='o';
}
int main(){
int mode_delete;
input();
output();
printf("どの様にデータを削除しますか? 対応する番号を入力してください。\n");
printf("1:全データの削除、2:個別にキャラデータ削除、3:個別に項目削除\n");
scanf("%d",&mode_delete);
delete(mode_delete);
output();
return 0;
}