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

  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

  1. 원래는 그냥 buffer와 id , pw를 비교하려 했는데, 그상태로 strcmp를 썻을 경우 유효한 결과값이 나오지 않아 buffer의 내용을 ID_B에 유효하게 다시 옮겨서 사용했는데, 이 방식을 쓰지 않고 유효한 결과값이 나오도록 할 수 있을까요? 최적화적인 관점에서 파일에서 받은 문자열을 굳이 다른 곳에 옮겨서 비교하지 않고, 그대로 비교하고 싶습니다. 감사합니다.
  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

    1. 초기화를 다음과 같이 하면 전부 0으로 clear됩니다. 원래 malloc은 메모리 할당을 해주는거지 초기화를 시켜주진 않습니다.

      memset(PW_B, 0, sizeof(char)*20);
      

      또한 PW_B[0] = '\0' 은 PW_B 전체를 초기화하는게 아니라 0번째에만 '\0' 을 넣어줄 뿐입니다.

      1. 아래 구문의 경우에 '\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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)