2013-08-21 5 views
4

입력 문자열이 미리 정의 된 제한을 초과하면 fgets에 약간의 문제가 있습니다. 아래의 예 촬영어떻게 fgets 오버플로 후 입력 버퍼를 지우시겠습니까?

: 나는 길이 MAXLEN을 초과하는 문자열을 입력 할 때 지금

for(index = 0; index < max; index++) 
    {printf(" Enter the %d string : ",index+1) 
       if(fgets(input,MAXLEN,stdin)) 
       { 
        printf(" The string and size of the string is %s and %d \n",input,strlen(input) + 1); 
        removeNewLine(input); 
        if(strcmp(input,"end") != 0) 
        { //Do something with input 
        } 
       } 

, 내가 입력이 MAXLEN에서 '\ 0'을 추가합니다 -1 그게 될 것을 알고있다. 나는 그래서 즉

Output : 
Enter the first string : Aaaaaaaaaaaaaaaaaaaa //Exceeds limit 
Enter the second string : Enter the third string : ....Waits input 

을 요구하지 않는 2 문자열을 입력 할 때 문제가 발생, 나는

return 
를 입력 할 때까지 기다립니다 C.에서 나는이 (가) 표준 방식을 버퍼 취소해야한다고 생각

두 번, 문자열에 처음 추가 될 때 다음 번에 다른 반환으로 더 많은 입력을 기대합니다. 1. 추가 반환 값을 입력하지 않고 버퍼를 지울 수있는 방법이 있습니까? 2. 동일한 오류 처리를 구현하려면 어떻게해야합니까? fgets 반환 값은 null이 아니며 strlen (input)이 fgets에 의해 허용되는 문자열 크기를 제공하기 때문에 수행해야 할 작업은 무엇입니까?

덕분에 많은

+0

게시자가 계속 게시물을 올리면 다른 사람의 답변은 앞으로는 의미가 없습니다. SO는 특정 문제를 해결하는 것을 목표로하지 않으며, 다른 사람들이 답을 찾는 데 도움이됩니다. – P0W

+0

되돌릴 수 있습니다. 죄송합니다! – Hooli

+0

@IDK 되돌아 가지 말아주세요, 지금 당장 질문하는 것 같아요 ... – Gangadhar

답변

4

이 보인다.

업무용는 약 2 시간이 입력에 입력 한 문자가 정확히 MAXLEN-2 때 다시 묻습니다 것을 제한으로

for(index = 0; index < max; index++) 
{ 
    printf(" Enter the %d th string :",index); 
    // if (strlen(input) >=MAXLEN) 

    if(fgets(input,MAXLEN,stdin)) 
    { 

     removeNewLine(input); 

     if(strcmp(input,"end") != 0) 
     // Do something with input 
      ; 
    } 
    if (strlen(input) == MAXLEN-1) 
     while((ch = getchar())!='\n' && ch != EOF ); 

} 

이 될 것입니다.

그렇지 않으면 문자 입력을 사용하여 input을 간단히 형성 할 수 있습니다.

+0

나를 위해 일했습니다! 한계 부분을 설명해 주시겠습니까? – Hooli

+0

@IDK,'MAXLEN'은 10이라고 말하고'abcdefgh'와'ENTER'를 입력하면 또 다른'ENTER'를 기다릴 것입니다 – P0W

+0

왜 그런가요? 문자열을 입력했는데 문자열 길이가 ofcourse의 null 문자를 제외한 9와 같으면 문자열이 넘칠 가능성이 있습니다. 어떤 코드 종속 문제가 여기 '\ n'과 관련되어 있기 때문에 대기하지 않는 이유는 무엇입니까? 위의 코드를 참조하십시오. 감사! – Hooli

3
while ((c=getchar()) != '\n' && c != EOF) 
    ; 

나 : 내가 제대로 이해하면 두 번 피하려고 눌러 입력처럼 입력 입력 범위 내에있을 때

scanf("%*[^\n]%*c"); 
+0

@OP : 첫 번째 선택 읽기 [ "입력 버퍼 플러시 방법"] (http://faq.cprogramming.com /cgi-bin/smartfaq.cgi?answer=1044873249&id=1043284392) –

+0

OP가 이미이 문제를 시도했다고 생각합니다. ""// 버퍼를 지우려고했습니다. _ 그리고 입력을 두 번 입력하면 입력이 넘칠 때 피하기를 원합니다. – P0W

+0

이 코드는'fgets'를 호출 한 직후가 아니라'fgets'를 호출 한 후 *로 이동해야하며'fgets'로 채워진 버퍼가'\ n '로 끝나지 않은 경우에만 호출해야합니다. –

관련 문제