c언어 문자열 초기화 후 나머지 와 파일입출력시 tap 좀 더 자세히 적어보았습니다.
조회수 561회
include
include
include
int main(void){
int c, i;
//연결리스트로 구현
FILE *cities, *members, *reser;//출항도시, 회원명단, 예약명단
char ID[20];
char PW[20];
char *ID_B;
char *PW_B;
char *NEW_ID;
char *NEW_PW;
char *NEW_NAME;
char *NEW_E_MAIL;
char *buffer;
INIT : //초기화면 label
printf("welcome to KORENA AIR\n");
printf("If you are member of KOREAN AIR, Please press '1'\n");
printf("If you are to be member of KOREAN AIR, Please press '2'\n");
printf("If you want to find ID, Please press '3'\n");
printf("If you want to find PW, Please press '4'\n");
scanf("%d", &c);
getchar();
buffer = (char*)malloc(20*(sizeof(char)));
ID_B = (char*)malloc(20*(sizeof(char)));
PW_B = (char*)malloc(20*(sizeof(char)));
NEW_ID = (char*)malloc(20*(sizeof(char)));
NEW_PW = (char*)malloc(20*(sizeof(char)));
NEW_NAME = (char*)malloc(20*(sizeof(char)));
NEW_E_MAIL = (char*)malloc(20*(sizeof(char)));
switch(c) {//맨처음 파일 읽을떄마다 읽는 위치 초기화 fseek( members, 0L, SEEK_SET );
case 1 : // 로그인
members = fopen("members.txt", "r");
if(members == NULL){
printf("디비 접속에 실패하였습니다.");
return 0;
}
printf("please enter your ID : ");
gets(ID);
printf("please enter your PASSWORD : ");
gets(PW);
//membes.txt 파일을 읽고 비교 // 파일 포인터를 초기위치로 설정
buffer[0] = '\0';
ID_B[0] = '\0';
PW_B[0] = '\0';
while( (fgets(buffer, sizeof(ID), members)) && (c == 1)){//eof 까지// 스트링끼리 비교하는데에 어려움을 겪고있음 3/4
for(i = 0; i < 20; i++){
if((buffer[i] == '\t') || (buffer[i] == '\0') || (buffer[i] == ' ') || (buffer[i] == '\n')){
break;
}
}
strncpy(ID_B, buffer, i);
if(strncmp(ID_B, ID, i) == 0){
fgets(buffer, sizeof(PW), members);
for(i = 0; i < 20; i++){
if((buffer[i] == '\t') || (buffer[i] == '\0') || (buffer[i] == ' ') || (buffer[i] == '\n')){
break;
}
}
strncat(PW_B, buffer, i);
if(strncmp(PW_B, PW, i) == 0){
c = 0;
}
}
buffer[0] = '\0';
}
if( c == 0){
printf("LOG - IN SUCCESS.\n");
break;
}
else{
printf("LOG - IN FAILED. Return to Log-in page.\n");
goto INIT;
}
fclose(members);
질문 1
여기서 문자열을 모두 초기화 하여 받고는 있지만, 실질적으로 문자열을 20자 출력해보았을 경우 뒤에 무의미한 문자들이 문자열에 내에 존재함을 알 수 있는데, 왜 이런 현상이 발생할까요? for(i = 0; i < 20; i++){ if((buffer[i] == '\t') || (buffer[i] == '\0') || (buffer[i] == ' ') || (buffer[i] == '\n')){ break; } }
strncat(PW_B, buffer, i); if(strncmp(PW_B, PW, i) == 0){ c = 0; } }
이 부분은 파일입출력으로 문자열을 받아왔을 시, 의미있는 부분의 끝이 \0이 아닌 탭으로 나타나는 것이 보여서 이런식으로 처리를 해주게 되었는데, 어째서 파일입출력에서는 tap으로 나타나는 걸까요? 차이점이 왜 발생하는 지 궁금합니다. 질문 2
- 원래는 그냥 buffer와 id , pw를 비교하려 했는데, 그상태로 strcmp를 썻을 경우 유효한 결과값이 나오지 않아 buffer의 내용을 ID_B에 유효하게 다시 옮겨서 사용했는데, 이 방식을 쓰지 않고 유효한 결과값이 나오도록 할 수 있을까요? 최적화적인 관점에서 파일에서 받은 문자열을 굳이 다른 곳에 옮겨서 비교하지 않고, 그대로 비교하고 싶습니다. 감사합니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
초기화를 다음과 같이 하면 전부 0으로 clear됩니다. 원래 malloc은 메모리 할당을 해주는거지 초기화를 시켜주진 않습니다.
memset(PW_B, 0, sizeof(char)*20);
또한 PW_B[0] = '\0' 은 PW_B 전체를 초기화하는게 아니라 0번째에만 '\0' 을 넣어줄 뿐입니다.
- 아래 구문의 경우에 '\0' 으로 끝났다면 strncat을 통해 string으로 마무리가 되겠지만 '\t' '' '\n' 과같은 문자로 끝났다면 string의 끝으로 판단하지 않습니다.
if((buffer[i] == '\t') || (buffer[i] == '\0') || (buffer[i] == ' ') || (buffer[i] == '\n')){ break; }
- 감사합니다. 현재 진행중인 과정에서 알 수 없는 사용자 2019.3.7 21:32
- 파일의 첫줄이 david921 인데 buffer의 사이즈가 충분히 큼에도 불구하고 david92까지만 읽히고 1이 다음 파일 출력에서 나오는 경우가 발생하는데 이 경우는 어떻게 해야할까요? 말그대로 버퍼의 문제일까요? string의 끝은 \0으로 알고 있지만, 버퍼에 실제로 저장되는 경우 string의 끝에 tap(빈 공간 하나가 아닌 빈공간 3개)가 나타나는 데 이 이유를 혹시 알 수 있을까요? 알 수 없는 사용자 2019.3.7 21:34
- 죄송합니다 buffer의 사이즈가 문자였습니다. 그러나 strcmp함수를 통한 비교에서는 제가 예상하던 결과가 나오지않는데, 이유를 혹시 알 수 있을까요? ID에 저장되어 있는 제가 입력한 문자열과 buffer에 저장되어 있는 문자열은 겉으로 보았을때에는 같은 문자열을 출력하는 것으로 나오지만, strcmp함수를 통한 비교에서는 같다는 결과인 0이 출력되지 않습니다. 두 문자열의 길이는 모두 30이며, pritnf를 통한 확인에서 같은 결과값이 출력됩니다. 알 수 없는 사용자 2019.3.7 21:54
댓글 입력