2012-12-14 4 views
0

문자열을 char 변수에 삽입하는 데 문제가 있습니다. 문제는 내가 그것을 기능에 넣을 때 나타난다. 내 프로그램을 디버깅 할 때, 그것은 printf를 표시하지만 여기 getsGETS - C가 작동하지 않습니다.

을 skipes 내 코드는 다음의 stdio 버퍼에 줄 바꿈이있다

int uloz(SPRAVA *p){ 

    char string[200]; 

    printf("Your message here: "); 
    gets(string); 
    printf("You have entered: %s", string); 
    getchar(); 

    return 0; 
} 
+11

첫 번째 : ** 사용하지 마십시오'gets' **; 그것은 매우 위험합니다 (따라서 언어에서 제거되었습니다). 둘째 : 일어날 일과 앞으로 일어날 일에 대해 자세히 설명해 주시겠습니까? –

+0

예를 들어 문자열을 저장하고 싶습니다. "내 이름은 마리오 야."라고 말하면서 공백을 넣고 싶습니다. –

+0

그리고 어떻게됩니까? 'gets' (urgh)와'fgets'는 공백을 읽는 데 아무런 문제가 없으므로 문제는 다른 것이되어야합니다. –

답변

3

사용 scanf(" %30[^\n]%*c",string);

  1. [^\n]\n까지 무엇이든 받아 들일 것입니다.
  2. 30
  3. 초기 space(' ')가 표준 입력 스트림에 이미 어떤 \n 소모됩니다 최대 30 자까지의 수의 길이를 제한합니다. (선택 사항 & 나는 그것을 확인하지 않았다)
  4. & 마지막으로, 은 문자열을 입력 한 후 \n을 누를 것이다.

입력 한 문자 (30 자 이후)를 버리려면 scanf(" %30[^\n]%*[^\n]%*c",string);을 사용하는 것이 좋습니다. 그러나 이것은 완전히 확인되지 않았습니다. 가능한 아이디어로 추가되었습니다. 사용하기 전에 테스트하십시오. :-)

+1

+1 일반적인 조언 인 '(f) gets와 scanf를 섞지 마십시오.'- 다른 곳에서 scanf를 사용한다면 여기에서도 scanf를 사용하십시오. –

1

(일부 이전 scanf에 의해 남은) 그래서 gets 즉시 만족한다.

이 문제를 해결할 수있는 쉬운 방법은 없습니다하지만 당신은 fgets 전에 입력을 폐기 시도 할 수 :

while((c = getchar()) != '\n' && c != EOF) 
    /* discard the character */; 

진정한 해결책은 scanffgets 혼합 방지하는 것입니다.


사용 fgets 대신 gets.

+0

좀 더 구체적으로 말하자면, 항상 전체 라인을 기대하지만, 여전히 int 등을 얻으려면 fgets를 사용하여 라인을 읽고 sscanf로 파싱합니다. 또한 scanf뿐만 아니라 getchar (질문 코드에서 사용됨)도 문제가 될 수 있습니다. – hyde

관련 문제