質問です!
質問です!
このソースを見て頂きたいのですが(作成途中のものです)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct busho{ /*構造体bushoの型枠の宣言*/
char b_name[41]; /*char型の配列b_name 要素数41*/
struct busho *next; /*次のbushoの構造体を指すポインタ変数next*/
struct shain *sentou; /*shainの構造体shainを指すポインタ変数sentou*/
}busho;
typedef struct shain{ /*構造体shainの型枠の宣言*/
char s_name[30]; /*char型の配列s_name 要素数30*/
char tel[12]; /*char型の配列tel 要素数12*/
char sex[1]; /*char型の配列sex 要素数1*/
struct shain *next; /*次のshainの構造体を指すポインタ変数next*/
}shain;
int main(void)
{
busho dmy; /*構造体busho型の変数dmyの宣言*/
busho *start = &dmy; /*構造体dmyのアドレスをstartに格納*/
busho *wkdata; /*データ設定用のポインタ変数wkdataの宣言*/
busho *wp; /*作業用のポインタwpの宣言*/
char b_name[20] = " "; /*char型の配列b_nameの宣言 要素数20*/
char buf[10]; /*char型の配列bufの宣言 要素数1*/
/*struct song *wkdata2;
struct song *wp2;
char s_name[15] = " ", buf2[10];
char tel[12];
char sex[1];
struct busho *tmp;
struct shain *tmp2;
*/
int num, i; /*int型の変数num,iの宣言(num:選択時の数字格納用),i:ループカウンタ*/
int len;
start->next = NULL; /*最初はデータがないのでNULLに設定*/
while(1)
{
printf("\n");
printf("[1][2][9]のどれかを選んでください!\n"); /*選択処理*/
printf("[1]:部署名登録\n");
printf("[2]:社員登録\n");
printf("[9]:システム終了\n");
printf("\n");
printf("[選択番号]:");
gets(buf);
num=atoi(buf);
switch(num){ /*部署名の追加処理*/
case 1:
while(1){
printf("[部署名(全角20文字)]:"); /*部署名をキーボード入力*/
gets(b_name);
len=strlen(b_name);
if(strcmp(b_name, " ")== 0){
break;
}
if(len>40){
printf("文字数オーバーです\n");
len=0;
continue;
}
else{
break;
}
}
wkdata=(struct busho *)malloc(sizeof(struct busho));
if(wkdata==NULL){
printf("メモリを確保する事ができません。\n");
return 1;
}
/*確保した構造体に部署名を設定する*/
strcpy(wkdata->b_name, b_name);
for(wp=start,i=0; wp->next != NULL; wp=wp->next,i++);
if(i==5){
printf("これ以上追加できません!!\n");
break;
}
if(wp->next == NULL){
wp->next = wkdata;
wkdata->next = NULL;
}
/*チェインの構造体の内容を表示*/
printf("**** 部署名リスト ****\n");
printf("\n");
for(wp=start->next,i=1; wp != NULL; wp = wp-> next, i++){
printf("[部署名%d]:%s\n", i, wp->b_name);
}
printf("\n");
break;
case 2:
if(start->next==NULL){
continue;
}
printf("[部署選択]:");
gets(buf);
num=atoi(buf);
printf("\n");
while(1){
}
case 9:
printf("[システム終了します!]\n");
return 0;
}
}
}
このソースで部署名を記入する時に全角、半角関わらず20桁以上打ち込むと再入力にできるのですが、次に正しいものを打ち込むとなぜか、画面がばぐってしまいます。何故だから分かる方おられましたら教えて頂きたいです>_<
よろしくお願いします。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct busho{ /*構造体bushoの型枠の宣言*/
char b_name[41]; /*char型の配列b_name 要素数41*/
struct busho *next; /*次のbushoの構造体を指すポインタ変数next*/
struct shain *sentou; /*shainの構造体shainを指すポインタ変数sentou*/
}busho;
typedef struct shain{ /*構造体shainの型枠の宣言*/
char s_name[30]; /*char型の配列s_name 要素数30*/
char tel[12]; /*char型の配列tel 要素数12*/
char sex[1]; /*char型の配列sex 要素数1*/
struct shain *next; /*次のshainの構造体を指すポインタ変数next*/
}shain;
int main(void)
{
busho dmy; /*構造体busho型の変数dmyの宣言*/
busho *start = &dmy; /*構造体dmyのアドレスをstartに格納*/
busho *wkdata; /*データ設定用のポインタ変数wkdataの宣言*/
busho *wp; /*作業用のポインタwpの宣言*/
char b_name[20] = " "; /*char型の配列b_nameの宣言 要素数20*/
char buf[10]; /*char型の配列bufの宣言 要素数1*/
/*struct song *wkdata2;
struct song *wp2;
char s_name[15] = " ", buf2[10];
char tel[12];
char sex[1];
struct busho *tmp;
struct shain *tmp2;
*/
int num, i; /*int型の変数num,iの宣言(num:選択時の数字格納用),i:ループカウンタ*/
int len;
start->next = NULL; /*最初はデータがないのでNULLに設定*/
while(1)
{
printf("\n");
printf("[1][2][9]のどれかを選んでください!\n"); /*選択処理*/
printf("[1]:部署名登録\n");
printf("[2]:社員登録\n");
printf("[9]:システム終了\n");
printf("\n");
printf("[選択番号]:");
gets(buf);
num=atoi(buf);
switch(num){ /*部署名の追加処理*/
case 1:
while(1){
printf("[部署名(全角20文字)]:"); /*部署名をキーボード入力*/
gets(b_name);
len=strlen(b_name);
if(strcmp(b_name, " ")== 0){
break;
}
if(len>40){
printf("文字数オーバーです\n");
len=0;
continue;
}
else{
break;
}
}
wkdata=(struct busho *)malloc(sizeof(struct busho));
if(wkdata==NULL){
printf("メモリを確保する事ができません。\n");
return 1;
}
/*確保した構造体に部署名を設定する*/
strcpy(wkdata->b_name, b_name);
for(wp=start,i=0; wp->next != NULL; wp=wp->next,i++);
if(i==5){
printf("これ以上追加できません!!\n");
break;
}
if(wp->next == NULL){
wp->next = wkdata;
wkdata->next = NULL;
}
/*チェインの構造体の内容を表示*/
printf("**** 部署名リスト ****\n");
printf("\n");
for(wp=start->next,i=1; wp != NULL; wp = wp-> next, i++){
printf("[部署名%d]:%s\n", i, wp->b_name);
}
printf("\n");
break;
case 2:
if(start->next==NULL){
continue;
}
printf("[部署選択]:");
gets(buf);
num=atoi(buf);
printf("\n");
while(1){
}
case 9:
printf("[システム終了します!]\n");
return 0;
}
}
}
このソースで部署名を記入する時に全角、半角関わらず20桁以上打ち込むと再入力にできるのですが、次に正しいものを打ち込むとなぜか、画面がばぐってしまいます。何故だから分かる方おられましたら教えて頂きたいです>_<
よろしくお願いします。
Re:質問です!
>for(wp=start,i=0; wp->next != NULL; wp=wp->next,i++);
とありますが、1件目入力時startはNULLですよね?
wp->nextの参照は大丈夫ですか?
バグとは関係ありませんが、
>wkdata=(struct busho *)malloc(sizeof(struct busho));
の部分は
wkdata=(busho *)malloc(sizeof(busho));
で良いと思います。
ソースを載せるときは、インデントをして、<pre>タグでくくってもらえると
見やすいのでありがたいです。(<>は半角でお願いします。)
printf( "ここまでは通った。%d行目\n", __LINE__ );
といったようなデバックログを追加しておくと、どこに問題があるのかが
見つけやすくなります。
とありますが、1件目入力時startはNULLですよね?
wp->nextの参照は大丈夫ですか?
バグとは関係ありませんが、
>wkdata=(struct busho *)malloc(sizeof(struct busho));
の部分は
wkdata=(busho *)malloc(sizeof(busho));
で良いと思います。
ソースを載せるときは、インデントをして、<pre>タグでくくってもらえると
見やすいのでありがたいです。(<>は半角でお願いします。)
printf( "ここまでは通った。%d行目\n", __LINE__ );
といったようなデバックログを追加しておくと、どこに問題があるのかが
見つけやすくなります。
Re:質問です!
/************************************
* *
* 社員名簿作成プログラム *
* *
*************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct busho{ /*構造体bushoの型枠の宣言*/
char b_name[42]; /*char型の配列b_name 要素数41*/
struct busho *next; /*次のbushoの構造体を指すポインタ変数next*/
struct shain *sentou; /*shainの構造体shainを指すポインタ変数sentou*/
}busho;
typedef struct shain{ /*構造体shainの型枠の宣言*/
char s_name[30]; /*char型の配列s_name 要素数30*/
char tel[12]; /*char型の配列tel 要素数12*/
char sex[1]; /*char型の配列sex 要素数1*/
struct shain *next; /*次のshainの構造体を指すポインタ変数next*/
}shain;
int main(void)
{
busho dmy; /*構造体busho型の変数dmyの宣言*/
busho *start = &dmy; /*構造体dmyのアドレスをstartに格納*/
busho *wkdata; /*データ設定用のポインタ変数wkdataの宣言*/
busho *wp; /*作業用のポインタwpの宣言*/
char b_name[20] = " "; /*char型の配列b_nameの宣言 要素数20*/
char buf[10]; /*char型の配列bufの宣言 要素数1*/
/*struct song *wkdata2;
struct song *wp2;
char s_name[15] = " ", buf2[10];
char tel[12];
char sex[1];
struct busho *tmp;
struct shain *tmp2;
*/
int num, i; /*int型の変数num,iの宣言(num:選択時の数字格納用),i:ループカウンタ*/
int len;
char buf3[1];
start->next = NULL; /*最初はデータがないのでNULLに設定*/
while(1)
{
printf("\n");
printf("[1][2][9]のどれかを選んでください!\n"); /*選択処理*/
printf("[1]:部署名登録\n");
printf("[2]:社員登録\n");
printf("[9]:システム終了\n");
printf("\n");
printf("[選択番号]:");
gets(buf);
num=atoi(buf);
switch(num){ /*部署名の追加処理*/
case 1:
while(1){
printf("[部署名(全角20文字)]:"); /*部署名をキーボード入力*/
/*gets(b_name);*/
scanf("%41s", b_name);
gets(buf3);
len=strlen(b_name);
if(strcmp(b_name, " ")== 0){
break;
}
if(len>40){
printf("文字数オーバーです\n");
rewind(stdin);
continue;
}
else{
break;
}
}
wkdata=(busho *)malloc(sizeof(busho));
if(wkdata==NULL){
printf("メモリを確保する事ができません。\n");
return 1;
}
/*確保した構造体に部署名を設定する*/
strcpy(wkdata->b_name, b_name);
for(wp=start,i=0; wp->next != NULL; wp=wp->next,i++);
if(i==5){
printf("これ以上追加できません!!\n");
break;
}
if(wp->next == NULL){
wp->next = wkdata;
wkdata->next = NULL;
}
printf("**** 部署名リスト ****\n"); /*チェインの構造体の内容を表示*/
printf("\n");
for(wp=start->next,i=1; wp != NULL; wp = wp-> next, i++){
printf("[部署名%d]:%s\n", i, wp->b_name);
}
printf("\n");
break;
case 2:
if(start->next==NULL){
continue;
}
case 9:
printf("[システム終了します!]\n");
return 0;
}
}
}
* *
* 社員名簿作成プログラム *
* *
*************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct busho{ /*構造体bushoの型枠の宣言*/
char b_name[42]; /*char型の配列b_name 要素数41*/
struct busho *next; /*次のbushoの構造体を指すポインタ変数next*/
struct shain *sentou; /*shainの構造体shainを指すポインタ変数sentou*/
}busho;
typedef struct shain{ /*構造体shainの型枠の宣言*/
char s_name[30]; /*char型の配列s_name 要素数30*/
char tel[12]; /*char型の配列tel 要素数12*/
char sex[1]; /*char型の配列sex 要素数1*/
struct shain *next; /*次のshainの構造体を指すポインタ変数next*/
}shain;
int main(void)
{
busho dmy; /*構造体busho型の変数dmyの宣言*/
busho *start = &dmy; /*構造体dmyのアドレスをstartに格納*/
busho *wkdata; /*データ設定用のポインタ変数wkdataの宣言*/
busho *wp; /*作業用のポインタwpの宣言*/
char b_name[20] = " "; /*char型の配列b_nameの宣言 要素数20*/
char buf[10]; /*char型の配列bufの宣言 要素数1*/
/*struct song *wkdata2;
struct song *wp2;
char s_name[15] = " ", buf2[10];
char tel[12];
char sex[1];
struct busho *tmp;
struct shain *tmp2;
*/
int num, i; /*int型の変数num,iの宣言(num:選択時の数字格納用),i:ループカウンタ*/
int len;
char buf3[1];
start->next = NULL; /*最初はデータがないのでNULLに設定*/
while(1)
{
printf("\n");
printf("[1][2][9]のどれかを選んでください!\n"); /*選択処理*/
printf("[1]:部署名登録\n");
printf("[2]:社員登録\n");
printf("[9]:システム終了\n");
printf("\n");
printf("[選択番号]:");
gets(buf);
num=atoi(buf);
switch(num){ /*部署名の追加処理*/
case 1:
while(1){
printf("[部署名(全角20文字)]:"); /*部署名をキーボード入力*/
/*gets(b_name);*/
scanf("%41s", b_name);
gets(buf3);
len=strlen(b_name);
if(strcmp(b_name, " ")== 0){
break;
}
if(len>40){
printf("文字数オーバーです\n");
rewind(stdin);
continue;
}
else{
break;
}
}
wkdata=(busho *)malloc(sizeof(busho));
if(wkdata==NULL){
printf("メモリを確保する事ができません。\n");
return 1;
}
/*確保した構造体に部署名を設定する*/
strcpy(wkdata->b_name, b_name);
for(wp=start,i=0; wp->next != NULL; wp=wp->next,i++);
if(i==5){
printf("これ以上追加できません!!\n");
break;
}
if(wp->next == NULL){
wp->next = wkdata;
wkdata->next = NULL;
}
printf("**** 部署名リスト ****\n"); /*チェインの構造体の内容を表示*/
printf("\n");
for(wp=start->next,i=1; wp != NULL; wp = wp-> next, i++){
printf("[部署名%d]:%s\n", i, wp->b_name);
}
printf("\n");
break;
case 2:
if(start->next==NULL){
continue;
}
case 9:
printf("[システム終了します!]\n");
return 0;
}
}
}
Re:質問です!
すみません!また教えて頂きたいです。
性別の部分の表示にバグがあるんですが・・理由がわかりません。教えてください>_<
[ソースコード]
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct busho{
char b_name[41];
struct busho *next;
struct shain *sentou;
};
struct shain{
char s_name[30];
char tel[12];
char sex[1];
struct shain *next;
};
int main(void)
{
struct busho dmy;
struct busho *start = &dmy;
struct busho *wkdata;
struct busho *wp;
char b_name[41] = " ";
char buf[41];
struct shain *wkdata2;
struct shain *wp2;
int num,i;
char b_name_cmp[41];
start->next = NULL;
while(1)
{
printf("\n");
printf("①②⑨のどれかを選んでください!\n");
printf("[1]:部署名登録\n");
printf("[2]:社員登録\n");
printf("[9]:システム終了\n");
printf("\n");
printf("[番号入力]:");
gets(buf);
num=atoi(buf);
switch(num){
case 1:
printf("[部署名]:");
gets(b_name);
if(strcmp(b_name, "")== 0){
break;
}
wkdata=(struct busho *)malloc(sizeof(struct busho));
if(wkdata==NULL){
printf("メモリを確保できません\n");
return 1;
}
/**/
strcpy(wkdata->b_name, b_name);
for(wp=start,i=0; wp->next != NULL;wp=wp->next,i++);
if(4<i){
printf("これ以上追加できません\n");
break;
}
if(wp->next == NULL){
wp->next = wkdata;
wkdata->next = NULL;
}
wkdata2=(struct shain *)malloc(sizeof(struct shain));
wkdata->sentou=wkdata2;
wkdata2->next=NULL;
printf("****[部署名リスト]****\n");
for(wp=start->next,i=1; wp != NULL; wp = wp-> next, i++){
printf("[部署名%d]:%s\n", i, wp->b_name);
}
printf("\n");
break;
case 2:
while(1){
wp=start;
if(wp->next == NULL){
printf("部署名が登録されていません\n");
break;
}
printf("[部署名]:");
gets(b_name_cmp);
if(strcmp(b_name_cmp, "")== 0){
break;
}
for(wp=start->next ; wp != NULL ; wp=wp->next){
if(strcmp(wp->b_name,b_name_cmp) == 0){
break;
}
}
if(wp==NULL){
continue;
}
wp2=wp->sentou;
wkdata2=(struct shain *)malloc(sizeof(struct shain));
if(wkdata2==NULL){
printf("メモリを確保する事ができません\n");
return 1;
}
while(1){
printf("[社員名]:");
gets(buf);
strcpy(wkdata2->s_name, buf);
if(strcmp(wkdata2->s_name,"")== 0){
continue;
}
else{break;}
}
while(1){
printf("[TE[/url]:");
gets(buf);
if(strcmp(buf,"")==0){
continue;
}
if(strlen(buf)>12){
continue;
}
for(i=0; 47<(int)buf && (int)buf<58 ; i++);
if(i==strlen(buf)){
break;
}
else if((int)buf<48 || 57<(int)buf){
continue;
}
}
strcpy(wkdata2->tel,buf);
while(1){
printf("[性別](男=1,女=0): ");
gets(buf);
if(strcmp(buf,"1")==0){
strcpy(wkdata2->sex,"男");
}
else if(strcmp(buf,"0")==0){
strcpy(wkdata2->sex,"女");
}
else{
printf("入力エラーです!(0か1を押してください!)\n");
continue;
}
break;
}
printf("\n");
for(wp2=wp->sentou; wp2->next != NULL; wp2=wp2->next);
if(wp2->next == NULL){
wkdata2->next = NULL;
wp2->next = wkdata2;
}
for(wp2=wp->sentou,i=1 ; wp2->next != NULL ; wp2=wp2->next,i++){
printf("[%d]部署名:%s\n", i,wp->b_name);
printf("名前:%s\n", wp2->next->s_name);
printf("TEL:%s\n", wp2->next->tel);
printf("性別:%s\n\n", wp2->next->sex);
if(i>10){
printf("これ以上追加できません!(CRを押してください)\n\n");
break;
}
}
}
break;
case 9:
printf("[システムを終了します]\n");
return 0;
}
}
}
性別の部分の表示にバグがあるんですが・・理由がわかりません。教えてください>_<
[ソースコード]
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct busho{
char b_name[41];
struct busho *next;
struct shain *sentou;
};
struct shain{
char s_name[30];
char tel[12];
char sex[1];
struct shain *next;
};
int main(void)
{
struct busho dmy;
struct busho *start = &dmy;
struct busho *wkdata;
struct busho *wp;
char b_name[41] = " ";
char buf[41];
struct shain *wkdata2;
struct shain *wp2;
int num,i;
char b_name_cmp[41];
start->next = NULL;
while(1)
{
printf("\n");
printf("①②⑨のどれかを選んでください!\n");
printf("[1]:部署名登録\n");
printf("[2]:社員登録\n");
printf("[9]:システム終了\n");
printf("\n");
printf("[番号入力]:");
gets(buf);
num=atoi(buf);
switch(num){
case 1:
printf("[部署名]:");
gets(b_name);
if(strcmp(b_name, "")== 0){
break;
}
wkdata=(struct busho *)malloc(sizeof(struct busho));
if(wkdata==NULL){
printf("メモリを確保できません\n");
return 1;
}
/**/
strcpy(wkdata->b_name, b_name);
for(wp=start,i=0; wp->next != NULL;wp=wp->next,i++);
if(4<i){
printf("これ以上追加できません\n");
break;
}
if(wp->next == NULL){
wp->next = wkdata;
wkdata->next = NULL;
}
wkdata2=(struct shain *)malloc(sizeof(struct shain));
wkdata->sentou=wkdata2;
wkdata2->next=NULL;
printf("****[部署名リスト]****\n");
for(wp=start->next,i=1; wp != NULL; wp = wp-> next, i++){
printf("[部署名%d]:%s\n", i, wp->b_name);
}
printf("\n");
break;
case 2:
while(1){
wp=start;
if(wp->next == NULL){
printf("部署名が登録されていません\n");
break;
}
printf("[部署名]:");
gets(b_name_cmp);
if(strcmp(b_name_cmp, "")== 0){
break;
}
for(wp=start->next ; wp != NULL ; wp=wp->next){
if(strcmp(wp->b_name,b_name_cmp) == 0){
break;
}
}
if(wp==NULL){
continue;
}
wp2=wp->sentou;
wkdata2=(struct shain *)malloc(sizeof(struct shain));
if(wkdata2==NULL){
printf("メモリを確保する事ができません\n");
return 1;
}
while(1){
printf("[社員名]:");
gets(buf);
strcpy(wkdata2->s_name, buf);
if(strcmp(wkdata2->s_name,"")== 0){
continue;
}
else{break;}
}
while(1){
printf("[TE[/url]:");
gets(buf);
if(strcmp(buf,"")==0){
continue;
}
if(strlen(buf)>12){
continue;
}
for(i=0; 47<(int)buf && (int)buf<58 ; i++);
if(i==strlen(buf)){
break;
}
else if((int)buf<48 || 57<(int)buf){
continue;
}
}
strcpy(wkdata2->tel,buf);
while(1){
printf("[性別](男=1,女=0): ");
gets(buf);
if(strcmp(buf,"1")==0){
strcpy(wkdata2->sex,"男");
}
else if(strcmp(buf,"0")==0){
strcpy(wkdata2->sex,"女");
}
else{
printf("入力エラーです!(0か1を押してください!)\n");
continue;
}
break;
}
printf("\n");
for(wp2=wp->sentou; wp2->next != NULL; wp2=wp2->next);
if(wp2->next == NULL){
wkdata2->next = NULL;
wp2->next = wkdata2;
}
for(wp2=wp->sentou,i=1 ; wp2->next != NULL ; wp2=wp2->next,i++){
printf("[%d]部署名:%s\n", i,wp->b_name);
printf("名前:%s\n", wp2->next->s_name);
printf("TEL:%s\n", wp2->next->tel);
printf("性別:%s\n\n", wp2->next->sex);
if(i>10){
printf("これ以上追加できません!(CRを押してください)\n\n");
break;
}
}
}
break;
case 9:
printf("[システムを終了します]\n");
return 0;
}
}
}