c언어 무한루프에 안 빠지는 방법좀 알려주세요
늘솜
질문 제목 : 무한루프 오류 안걸리기 질문 내용 :
#includestdio.h
#includestdlib.h
void insert(); //삽입 함수
void delete_list(); //삭제 함수
void delete_name(); //이름으로삭제 함수
void delete_number(); //학번으로삭제 함수
void delete_all(); //전부삭제 함수
void update(); //수정 함수
void update_name(); //이름으로수정 함수
void update_number(); //학번으로수정 함수
void print(); //출력 함수
void sort(); //버블소트
void swap(); //교체 함수
void search(); //검색 함수
void average(); //평균 함수
void help(); //도움말출력함수
typedef struct student // 학생 구조체 선언
{
char name[20]; // 이름 배열 선언
char number[10]; // 숫자 배열 선언
int p_score1;
int t_score;
int tel;
struct student * next;
}stdnt;
stdnt * head = null; //head포인터초기화
int count=0; //자료개수
int main()
{
while(1)
{
int num;
printf(▒▒▒▒▒▒▒▒▒▒▒▒▒\n);
printf(▒ 1.[삽 입] ▒\n);
printf(▒▒▒▒▒▒▒▒▒▒▒▒▒\n);
printf(▒ 2.[삭 제] ▒\n);
printf(▒▒▒▒▒▒▒▒▒▒▒▒▒\n);
printf(▒ 3.[수 정] ▒\n);
printf(▒▒▒▒▒▒▒▒▒▒▒▒▒\n);
printf(▒ 4.[모든성적출력] ▒\n);
printf(▒▒▒▒▒▒▒▒▒▒▒▒▒\n);
printf(▒ 5.[검 색] ▒\n);
printf(▒▒▒▒▒▒▒▒▒▒▒▒▒\n);
printf(▒ 6.[평 균] ▒\n);
printf(▒▒▒▒▒▒▒▒▒▒▒▒▒\n);
printf(▒ 7.[도 움 말] ▒\n);
printf(▒▒▒▒▒▒▒▒▒▒▒▒▒\n);
printf(▒ 8.[종 료] ▒\n);
printf(▒▒▒▒▒▒▒▒▒▒▒▒▒\n);
printf(◇ 해당 번호를입력하세요:\n ☞);
scanf(%d, &num);
switch(num)
{
case(1):
insert();
break;
case(2):
delete_list();
break;
case(3):
update();
break;
case(4):
print();
break;
case(5):
search();
break;
case(6):
average();
break;
case(7):
help();
break;
case(8):
printf(프로그램을 종료합니다\n);
exit(1);
default:
printf(잘못 입력하셨습니다\n);
}
}
return 0;
}
void insert()
{
stdnt * tmp, * ptr=head; //tmp포인터,ptr포인터선언//tmp는linkedlist,ptr은비교를위해서선언
tmp=(stdnt*)malloc(sizeof(stdnt));
printf(♧ 이 름:\t);
scanbsp;scanf(%s,tmp-name);
while(ptr!=null)
{
if(strcmp(tmp-name, ptr-name)==0)
{
printf(\n같은 이름이 이미 존재합니다\n);
free(tmp); //tmp에저장했었던name자료초기화
return;
}
ptr=ptr-next; //ptr에연결되어있는list들을전부비교함
}
printf(♧ 학 번:\t);
scanf(%s,tmp-number);
printf(♧ 프로그래밍 점수:\t);
scanf(%d,&tmp-p_score1);
printf(♧ 토 익 점 수:\t);
scanf(%d,&tmp-t_score);
printf(♧ 전 화 번 호:\t);
scanf(%d,&tmp-tel);
tmp-next=head; //tmp-next에head의주소값을저장한후
head=tmp; //head의주소값은다음자료의next가이전의자료를가리킴
printf(♧삽입되었습니다.♧\n\n);
count++;
}
void delete_list()
{
int command;
printf(----------------------------------------------------\n);
printf(1.이름을 검색하여 삭제합니다.\n);
printf(2.학번을 검색하여 삭제합니다.\n);
printf(3.전부 삭제\n);
printf(----------------------------------------------------\n);
printf(◇해당 번호를 입력하세요:);
scanf(%d,&command);
switch(command)
{
case(1):
delete_name();
break;
case(2):
delete_number();
break;
case(3):
delete_all();
break;
default:
printf(잘못된 입력입니다\n);
break;
}
}
void delete_name()
{
stdnt * tmp = head;
char name[20];
if(head==null)
{
printf(삭제할 데이터가 존재하지 않습니다\n);
return;
}
printf(삭제할 이름을 입력해주세요:);
scanf(%s,name);
while(tmp!=null)
{
if(strcmp(tmp-name,name)==0) // tmp를따라가면서자료의이름을비교
{
if(head-next==null) // 자료가하나일경우...
{
free(tmp); // tmp를프리시키고
head=null; // head포인터주소에 null대입
printf(삭제 되었습니다\n);
return;
} // 자료가 하나가 아닐 경우...
strcpy(tmp-name,head-name); // 기존의 자료들을 다시 복사
strcpy(tmp-number,head-number);
tmp-p_score1=head-p_score1;
tmp-t_score=head-t_score;
tmp-tel=head-tel;
//return ;
}
tmp=tmp-next; // tmp의포인터를 이동하면서 반복
// return;
}
head=head-next;
free(tmp);
printf(삭제 되었습니다\n);
count--;
}
void delete_number()
{
stdnt * tmp = head;
char number[10];
if(head==null)
{
printf(삭제할 데이터가 존재하지 않습니다\n);
return;
}
printf(◇삭제할 학번을 입력해주세요:);
scanf(%s,number);
while(tmp!=null)
{
if(strcmp(tmp-number,number)==0)
{
if(head-next==null)
{
free(tmp);
head=null;
printf(삭제 되었습니다\n);
return;
}
strcpy(tmp-name,head-name);
strcpy(tmp-number,head-number);
tmp-p_score1=head-p_score1;
tmp-t_score=head-t_score;
tmp-tel=head-tel;
}
tmp=tmp-next;
}
head=head-next;
free(tmp);
printf(삭제 되었습니다\n);
count--;
}
void delete_all()
{
stdnt * ptr = head, * link; //가장처음자료를가리키는ptr포인터와 //구조체를가리키는link포인터선언
if(head==null)
{
printf(삭제할 데이터가 없습니다\n);
return;
}
while(ptr!=null)
{
link=ptr-next; //ptr을이동하며메모리를free시킴
free(ptr);
ptr=link;
}
printf(삭제 되었습니다\n);
head=null; //모든노드를삭제하고head의초기화
count=0; //자료개수0개
}
void print()
{
stdnt * tmp = head;
int command;
if(head==null)
{
printf(데이터가 존재하지 않습니다\n);
}
printf(----------------------------------------------------\n);
printf(1.이름 순서로 출력\n);
printf(2.프로그래밍 성적순으로 출력\n);
printf(3.토익 성적순으로 출력\n);
printf(----------------------------------------------------\n);
printf(◇해당 번호를 입력하세요:);
scanf(%d,&command);
if(command1||command3)
&nbsr /{
printf(잘못 입력 하셨습니다\n);
return;
}
sort(command); // 버블 소트로정렬
}
void sort(int command)
{
int i,j;
stdnt*temp[100];
temp[0]=head;
for(i=1;icount;i++)
{
temp[i]=temp[i-1]-next; //각 링크드리스트에temp[0],temp[1]..포인터부여
}
for(i=0;icount;i++)
{
for(j=0;jcount;j++)
{
switch(command)
{
case(1):
if(strcmp(temp[i]-name,temp[j]-name)0)
{
swap(&temp[i],&temp[j]); //조건에 맞으면 메모리주소를 바꿈
}
break;
case(2):
if(temp[i]-p_score1temp[j]-p_score1)
{
swap(&temp[i],&temp[j]);
}
break;
case(3):
if(temp[i]-t_scoretemp[j]-t_score)
{
swap(&temp[i],&temp[j]);
}
break;
}
}
}
printf(----------------------------------------------------\n);
printf( 이름 학번 프로그래밍 토익 전화번호\n);
printf(----------------------------------------------------\n);
for(i=0;icount;i++)
{
printf(%s %10s %12d %5d %5d\n, temp[i]-name, temp[i]-number, temp[i]-p_score1, temp[i]-t_score, temp[i]-tel);
}
}
void swap(stdnt **a, stdnt **b)
{
stdnt * temp;
temp = *a;
*a= *b;
*b= temp;
}
void update()
{
int command;
printf(----------------------------------------------------\n);
printf(1.이름을 검색하여 삭제합니다.\n);
printf(2.학번을 검색하여 삭제합니다.\n);
printf(3.전부 삭제합니다.\n);
printf(----------------------------------------------------\n\n);
printf(◇해당 번호를 입력하세요 : );
scanf(%d,&command);
//for()
switch(command)
{
case(1):
update_name();
break;
case(2):
update_number();
break;
default:
printf(잘못된 입력입니다\n);
}
}
void update_name()
{
char search[20];
stdnt*tmp=head;
if(head==null)
{
printf(수정할 데이터가 없습니다\n);
return;
}
printf(수정할 학생의 이름을 입력해주세요:\n);
scanf(%s,search);
while(tmp!=null)
{
if(strcmp(tmp-name,search)!=0)
{
printf(학번:);
scanf(%s,tmp-number);
printf(프로그래밍 점수:);
scanf(%d,&tmp-p_score1);
printf(토익 점수:);
scanf(%d,&tmp-t_score);
printf(전화번호:);
scanf(%d,&tmp-tel);
return;
}
if(tmp-next==null)
{
printf(일치하는 학생이 없습니다\n);
return;
}
tmp=tmp-next;
}
}
void update_number()
{
char search[10];
stdnt*tmp=head;
if(head==null)
{
printf(수정할 데이터가 없습니다\n);
return;
}
printf(수정할 학생의 학번을 입력해주세요:\n);
scanf(%s, search);
while(tmp!=null)
{
if(strcmp(tmp-number,search)!=0)
{
printf(학번:);
scanf(%s, &tmp-number);
printf(프로그래밍 점수:);
scanf(%d, &tmp-p_score1);
printf(토익 점수:);
scanf(%d, &tmp-t_score);
printf(전화번호:);
scanf(%d, &tmp-tel);
return;
}
if(tmp-next==null)
{
printf(일치하는 학생이 없습니다\n\n);
return;
}
tmp=tmp-next;
}
}
void search()
{
char search[20];
stdnt*tmp=head;
if(head==null)
{
printf(데이터가 존재하지 않습니다\n\n);
return;
}
printf(검색할 이름을 입력해주세요:\n);
scanf(%s,search);
printf(----------------------------------------------------\n\n);
printf(이름 학번 프로그래밍 토익 전화번호\n);
printf(----------------------------------------------------\n\n);
while(tmp!=null)
{
if(!strcmp(search,tmp-name))
{
printf(%s %10s %12d %5d %5d\n,tmp-name,tmp-number,tmp-p_score1,tmp-t_score,tmp-tel);
return;
}
tmp=tmp-next;
}
}
void average()
{
stdnt * tmp = head;
int command, total=0;
printf(----------------------------------------------------\n);
printf(1.프로그래밍 평균 성적\n);
printf(2.토 익 평균 성적\n);
printf(----------------------------------------------------\n\n);
if(head==null)
{
printf(데이터가존재하지않습니다\n\n);
return;
}
printf(◇해당 번호를 입력하세요:);
scanf(%d,&command);
if(command1||command2)
{
printf(잘못입력하셨습니다);
return;
}
if(command==1)
{
while(tmp!=null)
{
total+=tmp-p_score1; //tmp를 이동하며 프로그래밍값을 더함
tmp=tmp-next;
}
total=total/count; //자료갯수로 나눔
printf(프로그래밍의 평균성적은 %d입니다\n\n, total);
}
if(command==2)
{
while(tmp!=null)
{
total+=tmp-t_score; //tmp를 이동하며 토익값을 더함
tmp=tmp-next;
}
total=total/count;&nbnbsp; //자료갯수로 나눔
printf(토익점수의 평균성적은 %d입니다\n\n, total);
}
//total=total/count; //자료갯수로 나눔
//printf(프로그래밍의 평균성적은 %d입니다\n\n, total);
}
void help()
{
printf(----------------------------------------------------\n\n);
printf(명령어1번은 linkedlist에 삽입합니다.\n);
printf(명령어2번은 linkedlist에 삭제합니다.\n);
printf(명령어3번은 linkedlist에 수정합니다.\n);
printf(명령어4번은 linkedlist를 출력합니다.\n);
printf(명령어5번은 linkedlist에 검색합니다.\n);
printf(명령어6번은 성적의 평균을 구합니다.\n);
printf(명령어7번은 도움말을 표시합니다.\n);
printf(----------------------------------------------------\n\n);
}
여기서 void update() ---
이 함수에서 숫자말고 문자를 입력하면 무한루프가 되는데 이 오류를 잡는 방법좀 알려주세요... ㅜ.ㅜ
빠른 답변 부탁드려요
-
조히
이제 문자 숫자 받을 수 있네요 ㄳㄳ
-
꼼지
스위치 문에서는 문자를 값으로 받을수 없지 않나요?
-
베레기
저기 스캔프에 %d 를 %s로 봐꿔보셧나요??
-
흰두루
void update()
{
int command;
printf(\----------------------------------------------------\\n\);
printf(\1.이름을 검색하여 삭제합니다.\\n\);
printf(\2.학번을 검색하여 삭제합니다.\\n\);
printf(\3.전부 삭제합니다.\\n\);
printf(\----------------------------------------------------\\n -
재넘이
문제있는부분을 따로좀 올려주시면;;; 아니면 표시라던가;;;
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2695355 | c언어 for함수 | 미쿡 | 2025-05-19 |
2695327 | 안녕하세요 제가 이번에 좀 큰 프로그램을.. | 악당 | 2025-05-19 |
2695295 | mutex동기화의 thread기반 채팅 서버소스 질문입니다 | 그루터기 | 2025-05-19 |
2695270 | 질문이요..swap 관한겁니다..ㅠㅠ (3) | 콩알녀 | 2025-05-19 |
2695244 | 노땅초보궁금한게 하나 있는데요..반복문(while문)초보자질문 (6) | 큰꽃늘 | 2025-05-18 |
2695166 | do while 문 어떤것이잘못된건지 모르겠어요 (2) | 아이폰 | 2025-05-18 |
2695122 | 구조체에 대해 물어보고 싶은게 있습니다 ^^^.. (7) | 수련 | 2025-05-17 |
2695091 | txt 파일 입출력 후 2차 배열에 저장하기입니다. (3) | 헛장사 | 2025-05-17 |
2695063 | 수도요금 프로그램좀 짜주세요. | 시내 | 2025-05-17 |
2695033 | 답변좀요ㅠㅠ (1) | 비사벌 | 2025-05-16 |
2695010 | C++의 STL은 왜 굳이 템플릿화 시켜서 라이브러리를 만드나요? (초보수준의 질문..) (2) | 엘보어 | 2025-05-16 |
2694958 | 로직이 변한다는 것에 대해서 궁금합니다. | 튼동 | 2025-05-16 |
2694929 | 열혈강의 25-2 두번째 문제 질문 | 지우개 | 2025-05-15 |
2694900 | dequeue 에서 리턴값 프린트 방법알려주세요 오늘 12시까지 대화방에 있습니다 도와주세요 | 미투리 | 2025-05-15 |
2694854 | 절대값을 구할때 (2) | 그녀는귀여웠다 | 2025-05-15 |
2694827 | 이제 어떻게 공부해야할지 모르겠네요 | 새얀 | 2025-05-14 |
2694778 | 순열 계산요. | 맛조이 | 2025-05-14 |
2694754 | ShowWindow 함수를 이용하려 하는데 질문있습니다. (2) | 파도 | 2025-05-14 |
2694731 | 리눅스 커널의 시작점 질문 | 미르 | 2025-05-13 |
2694702 | 이거 뭐가문제인가요 코드수정좀 (3) | 맑은 | 2025-05-13 |