사용자 정의 함수에서 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;

}