2016-11-19 1 views
0
while(scanf("%s",a)) 
{ 

    if(a[0]=='#') 
    break; 
    nextpermutation(a); 
} 

이 while 루프 완벽 scanf와 작동 "하지만 (scanf와 넣으면 "% [^ \ n] s", a) 그 동안 한 번만 실행됩니다. scanf의 반환 값을 확인했는데 여전히 동일했습니다 왜 이런 일이 발생하지 않았습니까?차이 (%의 S")

+2

당신이 scanf''의 evilness을 실현 말고 대신'표준 : cin'를 사용해야? –

+1

'% s'은 공백 문자를 버리고'% [set]'은 공백 문자를 버립니다. 첫 번째 호출에서는 스트림에 남아있는 '\ n' 문자까지 읽지 만 포함하지는 않습니다. 두 번째 호출에서'% [^ \ n]'은 어떤 문자도 검색 할 수 없으며 첫 번째 문자는'\ n '입니다. –

+0

'% 99 [^ \ n] "'- 공백을 무시하기위한 문자열의 시작 부분과 버퍼 오버플로를 방지하기위한 99 자의 한계를 적어 두십시오. –

답변

1

s은?

%[^\n]s에 존재하고있는 것이 무엇입니까 귀하의 scanf("%[^\n]s") 포함 형식 지정자로 %[^\n] 다음에 외로운 s이옵니다. 시퀀스가 %[^\n]과 일치하면 입력 스트림에 s이 있어야합니다. 물론 이것은 일반 동작 인 %s과 매우 유사하지 않습니다. 이러한 형식의 일치하는 순서는 그 이유만으로 매우 다릅니다.

[]%s 형식의 수정자가 아닙니다. 잘못 생각한 것 같습니다. []scanf으로 설정하면 자체 형식 지정자가됩니다. 혹시라도 %[^\n]s 대신 %[^\n]을 의미하셨습니까?

1

이 패자의 전투 : "%s""%[^\n]s" :

모두 지정자는 나쁜하고 속하지 않는 강력한 코드입니다. 사용자 입력을 제한하지 않고 대상 버퍼를 쉽게 오버런시킬 수 없습니다.

s ("%[^\n]s")은 용도가 없습니다. @Jonathan Leffler. 따라서 "%[^\n]"은 다음과 같이 검토됩니다 - 아직도 나쁘다.

"%s"은 공백을 사용합니다. "%[^\n]"하지 않습니다 주인공이 '\n' 경우 @Igor Tandetnik

"%[^\n]"은 변경 또는 거의 알 수없는 상태에서 a를 떠나, 아무것도을 읽지 않습니다.

"%[^\n]"'\n'을 제외한 모든 문자를 읽습니다.

"%s"은 모든 선행 공백을 읽고이를 버리고 공백이 아닌 모든 공백을 읽고 저장합니다.


더 나은 사용자의 입력을 읽어 fgets()를 사용하고이를 분석한다.

예 : 공백을 포함하여, 입력 라인을 읽고 :

char a[100]; 
if (fgets(a, sizeof a, stdin) == NULL) Handle_EOF_or_Error(); 

// if the potential trailing \n is not wanted 
a[strcspn(a, "\n")] = '\0';