while(scanf("%s",a))
{
if(a[0]=='#')
break;
nextpermutation(a);
}
이 while 루프 완벽 scanf와 작동 "하지만 (scanf와 넣으면 "% [^ \ n] s", a) 그 동안 한 번만 실행됩니다. scanf의 반환 값을 확인했는데 여전히 동일했습니다 왜 이런 일이 발생하지 않았습니까?차이 (%의 S")
while(scanf("%s",a))
{
if(a[0]=='#')
break;
nextpermutation(a);
}
이 while 루프 완벽 scanf와 작동 "하지만 (scanf와 넣으면 "% [^ \ n] s", a) 그 동안 한 번만 실행됩니다. scanf의 반환 값을 확인했는데 여전히 동일했습니다 왜 이런 일이 발생하지 않았습니까?차이 (%의 S")
는 s
은?
%[^\n]s
에 존재하고있는 것이 무엇입니까 귀하의 scanf("%[^\n]s")
는 이 포함 형식 지정자로 %[^\n]
다음에 외로운 s
이옵니다. 시퀀스가 %[^\n]
과 일치하면 입력 스트림에 s
이 있어야합니다. 물론 이것은 일반 동작 인 %s
과 매우 유사하지 않습니다. 이러한 형식의 일치하는 순서는 그 이유만으로 매우 다릅니다.
[]
은 %s
형식의 수정자가 아닙니다. 잘못 생각한 것 같습니다. []
을 scanf
으로 설정하면 자체 형식 지정자가됩니다. 혹시라도 %[^\n]s
대신 %[^\n]
을 의미하셨습니까?
이 패자의 전투 : "%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';
당신이 scanf''의 evilness을 실현 말고 대신'표준 : cin'를 사용해야? –
'% s'은 공백 문자를 버리고'% [set]'은 공백 문자를 버립니다. 첫 번째 호출에서는 스트림에 남아있는 '\ n' 문자까지 읽지 만 포함하지는 않습니다. 두 번째 호출에서'% [^ \ n]'은 어떤 문자도 검색 할 수 없으며 첫 번째 문자는'\ n '입니다. –
'% 99 [^ \ n] "'- 공백을 무시하기위한 문자열의 시작 부분과 버퍼 오버플로를 방지하기위한 99 자의 한계를 적어 두십시오. –