none
C 언어 gets 함수 RRS feed

  • 질문

  • visual studio에서는 gets 함수를 못 쓰나보더라구요. 그래서 찾아보니 gets_s, fgets 등등 대체 함수가 있었는데요 

    #include<stdio.h>
    void main() {
    char *ptr;
    puts("문자열을 입력하십시오");
    //fgets(ptr,sizeof(ptr)-1,stdin);
    gets_s(ptr,sizeof(ptr));
    puts(ptr);
    }

    이렇게 대체해서 쓰면 계속 예외가 발생했다며 더 이상 진행이 안 되더라구요. gets_s에서 입력은 되는데 엔터는 안 쳐지는 그런 상황이에요.

    C언어 처음 배우는 거기도 하고 버퍼, 인자 아직 그런 걸 잘 모르거든요 ㅠ

    그리고 책에서는 원래 

    #include<stdio.h>
    void main() {
    char *ptr;
    puts("문자열을 입력하십시오");
    gets(ptr);
    puts(ptr);
    }

    이런 형태였습니다. ptr을 반드시 써서 결과를 도출하라고 했구요.

    그런데 gets가 못 쓰는 함수...ㅜ 

    어떻게 고쳐야 실행이 되는지 알려주세요~


    • 편집됨 호갱 2018년 7월 6일 금요일 오전 11:38
    2018년 7월 4일 수요일 오전 5:49

답변

  • 제가 위에서 버퍼라는 용어를 사용했지만 이건 그냥 char 배열을 지칭하는 말이었습니다.

    배열 대신 꼭 포인터를 사용해야 한다면 new 로 동적할당하여 다음과 같이 사용하시면 됩니다.

    #include <stdio.h>
    void main() {
    	char* ptr = new char[101];
    	puts("문자열을 입력하십시오");
    
    	gets_s(ptr, 100);
    	puts(ptr);
    
    	delete ptr;
    }

    결론적으로 char 배열을 사용하든 char 포인터에 동적 할당을 하든 gets_s 함수에 전달하려면

    문자열을 담을 수 있는 메모리를 할당하여 넘기셔야 합니다.

    지금 질문자에게는 당장 돌아가는 결과물을 만드는게 중요한게 아니라

    왜 동작이 안되는지, 이 것을 해결하려면 무엇이 필요한지 아는 것이 더 중요해보입니다.

    반복적으로 말씀드리지만 최소한 기초적인 것은 책을 보고 습득하신 다음 질문하시면 좋겠네요.

    2018년 7월 9일 월요일 오전 5:18

모든 응답

  • 초기화되지도, 할당되지도 않은 포인터 ptr 에 키보드로 입력받은 문자열을 담으려고 하니 오류가 날 수 밖에요..

    ptr 변수 대신 문자 배열 버퍼를 선언하시고 gets_s 함수 호출 시 해당 버퍼를 전달하면 됩니다.

    #include <stdio.h>
    void main() {
    	char buffer[101];	// 최대 100자를 담을 수 있는 버퍼
    	puts("문자열을 입력하십시오");
    
    	gets_s(buffer, 100);
    	puts(buffer);
    }

    이것 역시 C언어 기초 도서를 차근차근 보신다면 무엇이 문제였었는지 아시게 될거에요.

    2018년 7월 4일 수요일 오전 7:17
  • 음...제 질문을 안 읽어 보셨군요..ㅎ...전 버퍼를 아직 안 배웠다고 말씀드렸고, 그리고 포인터 변수를 쓰는 답변을 달라고 요청드린건데...ㅜ
    2018년 7월 9일 월요일 오전 12:25
  • 제가 위에서 버퍼라는 용어를 사용했지만 이건 그냥 char 배열을 지칭하는 말이었습니다.

    배열 대신 꼭 포인터를 사용해야 한다면 new 로 동적할당하여 다음과 같이 사용하시면 됩니다.

    #include <stdio.h>
    void main() {
    	char* ptr = new char[101];
    	puts("문자열을 입력하십시오");
    
    	gets_s(ptr, 100);
    	puts(ptr);
    
    	delete ptr;
    }

    결론적으로 char 배열을 사용하든 char 포인터에 동적 할당을 하든 gets_s 함수에 전달하려면

    문자열을 담을 수 있는 메모리를 할당하여 넘기셔야 합니다.

    지금 질문자에게는 당장 돌아가는 결과물을 만드는게 중요한게 아니라

    왜 동작이 안되는지, 이 것을 해결하려면 무엇이 필요한지 아는 것이 더 중요해보입니다.

    반복적으로 말씀드리지만 최소한 기초적인 것은 책을 보고 습득하신 다음 질문하시면 좋겠네요.

    2018년 7월 9일 월요일 오전 5:18