공간

2010-04-27 5 views
2

내가 이상한 문제공간

내가는 scanf()와 콘솔에서 문자열을 읽으려고하는 데 문제와는 scanf를 읽는 방법이

scanf("%[^\n]",string1); 

하지만 같은

아무것도 읽을 수 없습니다. 그것은 단지 전체 scanf를 건너 뜁니다.

내가 버퍼 오버 플로우 및 입력 버퍼에 머물고 길잃은 뉴 라인의 불필요한 문제를 가져올 수있는 공백 문자열을 읽을 scanf를 사용하려고 GCC 컴파일러

+1

나는 다른 질문 (http://stackoverflow.com/questions/2718595/how-to-read-a-string-from-an-delimited-file)에서 내 충고를하지 않았다. 'scanf'를 완전히 피하는 것에 대해? 한숨. – jamesdlin

답변

5

에 노력하고있어 나중에 읽을 수 있습니다. gets()는 종종 맨 페이지에서

그러나,이에 대한 해결책으로 제시된다

는 사용하지 마십시오 얻는다(). 불가능 많은 문자 이 (취득 방법을 사전에 데이터를 모르고 말 때문에) 가 버퍼의 끝을지나 문자를 저장하는 것) (읽기, 때문에 얻는 것, 사용하기 매우 위험 . 그것은 컴퓨터 보안을 깨는 데 사용되었습니다. 대신 fgets() 을 사용하십시오.

그래서 대신 gets를 사용하는, 잘 작동합니다 키보드

1

에서 문자열을 읽어 STDIN 스트림과 fgets을 사용하므로 다른 뭔가 잘못된 것입니다. 홉스 (hobbs)가 말했듯이, 입력에 개행 문자가있을 수 있습니다.이 경우 아무 것도 일치하지 않습니다. 또한 개행 문자를 사용하지 않으므로 루프에서이 작업을 수행하면 첫 번째 호출이 개행을 시작하고 다음 호출이 아무 것도 얻지 않습니다. 개행을 읽으려면 다른 호출이 필요하거나 공백을 건너 뛰려면 형식 문자열의 공백을 사용하십시오. 또한 scanf의 반환 값을 확인하여 실제로 형식 지정자와 일치하는지 확인하는 것도 좋습니다.

또한 버퍼 오버플로를 방지하기 위해 최대 길이를 지정하는 것이 좋습니다. 그래서 당신이 원하는 식으로 뭔가 :이 스킵 (무시) ​​빈 라인과 공백 라인의 시작과 최대 및 줄 바꿈을 포함하지 않는 입력의 99 자까지 읽어

char buffer[100]; 
if (scanf(" %99[^\n]", buffer) == 1) { 
    /* read something into buffer */ 

. 후행 또는 내장 공백은 건너 뛸 수 없으며 선행 공백 만 건너 뜁니다.

0

귀하의 scanf 호출이 루프 안에있을 것입니다. 내가 처음 전화 할 때 작동 할거야. 두 번째 이후의 시간에만 실패 할 것입니다.

처음으로 줄 바꿈 문자에 도달 할 때까지 읽습니다. 개행 문자는 읽지 않은 상태로 남습니다. (확률은 라이브러리가 내부적으로 읽지 않고 읽지 않도록 ungetc를 호출하지만, 프로그램의 관점에서 보았을 때 개행 문자가 읽히지 않기 때문에 중요하지 않습니다.)

두 번째로, 개행 문자에 도달합니다. 그 줄 바꿈 문자는 여전히 줄 앞에서 기다리고 있으며 scanf는 앞에 대기중인 문자를 모두 0으로 읽습니다.

세 번째 ... 동일합니다.

if (scanf("%99[^\n]%*c", buffer) == 1) { 

편집 :

당신은 아마이 원하는 실수로 의도 한대로 %의 *의 C를 삽입하기 전에, 다른 답변에서 대신 질문에서 복사 및 붙여 넣기. 이 결과 코드 행은 100 바이트보다 긴 입력 행이있는 경우 이상하게 작동합니다. % * c는 개행 문자 대신 일반 바이트를 사용하기 때문입니다.

그러나,이 작업을 수행하는 것이 얼마나 위험주의 사항 :

scanf("%[^n]%*c", string1); 

당신이 더 이상 버퍼보다 ​​입력 라인이있는 경우가 있기 때문에, 입력이 다른 모든 변수를 통해 도보로 스택하고 모두. 이를 오버 플로우가 스택으로 이동하더라도 버퍼 오버플로라고합니다.

0
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char *text(int n); 

int main() 
{ 
char str[10]; 
printf("enter username : "); 
scanf(text(9),str); 
printf("username = %s",str); 

return 0; 
} 

char *text(int n) 
{ 
fflush(stdin);fflush(stdout); 
char str[50]="%",buf[50],st2[10]="[^\n]s"; 
char *s;itoa(n,buf,10); 
// n == -1 no buffer protection 
if(n != -1) strcat(str,buf); 
strcat(str,st2);s=strdup(str); 
fflush(stdin);fflush(stdout); 
return s; 
}