사용자 정의 함수에서 scanf를 썼는데 입력 받지도 않고 그냥 다른거 함수로 넘어가는데 사용자 정의 함수에선 scanf 못 쓰나요?
DLT함수가 문제예용.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#pragma warning(disable:4996)
const char* read_ins(FILE* in,int token) {
static char buf1[1] = { 0 };
int bufcount = 0;
static int readcount = 0;
char buf2[16] = { 0, };
int endcount = 0;
int size;
int length;
fseek(in, 0, SEEK_END);
size = ftell(in);
fseek(in,readcount,SEEK_SET);
do {
if (buf1[0] == 10 ) {
++readcount;
}
else if (buf1[0] == 32) {
++readcount;
}
fseek(in, readcount, SEEK_SET);
fread(buf1, sizeof(char), 1, in);
if (buf1[0] != 10 && buf1[0] !=32 && size>=readcount) {
buf2[bufcount] = buf1[0];
++bufcount;
++readcount;
}
if (buf1[0] == 10 || buf1[0] == 32) { endcount = 1; }
} while (endcount==0);
length=strlen(buf2);
if (token == 0) {
readcount = readcount - length -1;
}
token = 0;
if (size != readcount) {
return buf2;
}
else {
token = -1;
return token;
}
}
struct Student {
char name;
char sex[2];
char region;
char subject[16];
float score;
int height;
int weight;
};
int LAD(struct Student* s,const char* buf) {
FILE* fp = fopen(buf, "r");
int done = 0;
struct Student temp;
int i = 0, o = 0, p = 0;
int k=0;
while (k>-1) {
k = fscanf(fp, "%s %s %s %s %f %d %d", &s[i].name, &s[i].sex, &s[i].region, &s[i].subject, &s[i].score, &s[i].height, &s[i].weight);
done++;
i++;
}
fclose(fp);
for (o = 0; o < done - 1; o++) {
for (p = o + 1; p < done; p++) {
if (strcmp(s[o].name, s[p].name) > 0) {
temp = s[o];
s[o] = s[p];
s[p] = temp;
}
}
}
return done;
}
void PRT(struct Student* s,int done) {
for (int i = 1; i < done; i++) {
printf("%s %s %s %s %.2f %d %d\n", s[i].name, s[i].sex, s[i].region, s[i].subject, s[i].score, s[i].height, s[i].weight);
}
}
int IST(struct Student* s, FILE* in,int done) {
struct Student temp;
char temp1[16] = {0,}, buf[16] = { 0, };
int i=0,p=done,q=0,index=0;
do {
strcpy(buf,read_ins(in,1));
switch (index) {
case 0:
strcpy(temp.name, buf);
break;
case 1:
strcpy(temp.sex,buf);
break;
case 2:
strcpy(temp.region, buf);
break;
case 3:
strcpy(temp.subject, buf);
break;
case 4:
temp.score = atof(buf);
break;
case 5:
temp.height = atoi(buf);
break;
case 6:
temp.weight = atoi(buf);
break;
}
++index;
} while (index<7);
do {
if (strcmp(temp.name, s[p].name) < 0) {
s[p + 1] = s[p];
}
--p;
} while (p>-1);
index = 0;
do {
if(strcmp(temp.name,s[i].name)>0)
q++;
i++;
} while (i<=done);
do {
switch (index) {
case 0:
strcpy(s[q].name,temp.name);
break;
case 1:
strcpy(s[q].sex,temp.sex);
break;
case 2:
strcpy(s[q].region,temp.region);
break;
case 3:
strcpy(s[q].subject,temp.subject);
break;
case 4:
s[q].score = temp.score;
break;
case 5:
s[q].height = temp.height;
break;
case 6:
s[q].weight = temp.weight;
break;
}
++index;
} while (index < 7);
++done;
return done;
for (int i = 1; i < done; i++) {
printf("%s %s %s %s %.2f %d %d\n", s[i].name, s[i].sex, s[i].region, s[i].subject, s[i].score, s[i].height, s[i].weight);
}
}
int DLT(struct Student* s, FILE* in, int done) {
char buf;
strcpy(buf, read_ins(in, 1));
int index=0;
int nonecount=0;
char z=0;
for (int i = done; i >-1; i--) {
if (buf != s[i].name) {
++nonecount;
}
else if (strcmp(buf, s[i].name) < 0) {
++index;
}
}
for (int k = 0; k <= done; k++) {
if (strcmp(buf, s[k].name) == 0) {
printf("삭제할 대상을 찾았습니다.%s.삭제하시겠습니까?(y/n)\n", buf); break;
}
}
scanf("%c", &z);
if (z == 89 || z == 121) {
printf("삭제하겠습니다\n");
for (int k = 0; k <= done; k++) {
s[k] = s[k + 1];
}
memset(&s[done], 0, sizeof(s[done]));
}
else if (z == 78 || z == 110) {
printf("삭제하지 않겠습니다\n");
}
if (nonecount == done) {
printf("삭제할 대상을 찾지 못 하였습니다.\n");
}
for (int i = 1; i < done; i++) {
printf("%s %s %s %s %.2f %d %d\n", s[i].name, s[i].sex, s[i].region, s[i].subject, s[i].score, s[i].height, s[i].weight);
}
}
void SRC(struct Student* s,FILE* in,int done) {
char buf; int nonecount = 0;
strcpy(buf, read_ins(in, 1));
for (int i = 0; i <= done; i++) {
if (strcmp(s[i].name, buf) == 0) printf("%s %s %s %s %.2f %d %d\n", s[i].name, s[i].sex, s[i].region, s[i].subject, s[i].score, s[i].height, s[i].weight);
else { ++nonecount; }
}
if (nonecount == done) {
printf("대상을 찾았습니다.\n");
}
else if (nonecount >done) {
printf("대상을 찾지 못하였습니다.\n");
}
}
int main(void) {
char CREATE="CREATE";
char SEARCH="SEARCH";
char LOAD="LOAD";
char PRINT ="PRINT";
char INSERT ="INSERT";
char DELETE = "DELETE";
char y;
char buf;
int done=0;
int size;
int token = 0;
struct Student *students = sizeof(struct Student[100]);
printf("실행 하시겠습니까(Y):");
scanf("%c", &y);
if (y ==89 ||y== 121) {
FILE* in = fopen("input.txt", "r");
fseek(in, 0, SEEK_END);
size = ftell(in);
fseek(in, 0, SEEK_SET);
do {
strcpy(buf, read_ins(in,1));
if (strcmp(buf, CREATE) == 0) {
printf("CREATE명령어를 실행합니다.\n");
struct Student s[100];
students = &s;
memset(s, 0, sizeof(s));
}
else if (strcmp(buf, LOAD) == 0) {
printf("LOAD명령어를 실행합니다.\n");
strcpy(buf, read_ins(in, 1));
done = LAD(students, buf);
}
else if (strcmp(buf, PRINT) == 0) {
printf("PRINT명령어를 실행합니다.\n");
PRT(students, done);
}
else if (strcmp(buf, INSERT) == 0) {
printf("INSERT명령어를 실행합니다.\n");
IST(students, in, done);
}
else if (strcmp(buf, DELETE) == 0) {
printf("DELETE명령어를 실행합니다.\n");
DLT(students, in, done);
}
else if (strcmp(buf, SEARCH) == 0) {
printf("SEARCH명령어를 실행합니다.\n");
SRC(students, in,done);
}
} while (token!=-1);
fclose(in);
}
else {
printf("다시 입력해주세요.");
}
return 0;
}
ㄴ
아하 글쿤요.. 그럼 뭐가 문제지..아씨..
함수(); 이렇게 써야하는걸 함수; 이지랄한건지 아닌지 봐야하니 코드부터올리셈
코드 올렸읍니다..
버퍼 안비워서 그런거아님? 길어서 안봄
음..삭제 할꺼냐 말꺼냐 묻는 거만 scanf 써서 z라는 char 변수에 넣으려 했는데 char 초기화를 0으로 걍 해놨거든용? 그게 혹시 문제가 될 수 있나요?
코드를 올려봐 빠르게 봐줄게
코드 올렸읍니다..
다른 함수로 넘어갔다? 1. 호출을 안했다 2. 이전 scanf 받고나서 남은 엔터가 문자열 받는 scanf에 들어가버렸다. 당장 생각나는건 이정도? - dc Cpp