fscanf(inputSTREAM, "$%s$", out)
도 $ 기호를 반환 할 수 있는지 확인하려고합니다 - 거기에 방법이 있습니까?
fscanf(inputSTREAM, "$%s$", out)
도 $ 기호를 반환 할 수 있는지 확인하려고합니다 - 거기에 방법이 있습니까?
scanf()
패밀리를 사용하여 달러 기호와 비어 있지 않은 문자열을 검색하는 방법이 있다고 생각하지 않습니다. 가장 가까운 접근 방식은 아마도 스캔 세트를 사용하는 것이지만 스캔 세트는 정규식과 같지 않으므로 원하는 패턴을 지정하기 위해 정규식이 필요합니다. 실제로
, 당신은 아마 사용하여 문자열로 첫번째 달러 기호를 얻을 수 :
fscanf(inputSTREAM, " %1[$]%[^$]%*[$]", &out[0], &out[1]);
당신은 당신이 정확한 알고하더라도, 후자 달러 기호에 대해 같은 스턴트를 당길 수 없습니다 문자열의 길이 문제는 두 번째 달러 기호로 문자열 끝의 null을 덮어 써야하고 문자열 뒤에 NUL '\0'
이 필요하다는 것입니다. 최종 달러를 추가하는 것은 문자열의 처음에 첫 번째 달러를 삽입하는 것보다 훨씬 쉽습니다. 세 번째 스캔 셋에는 할당 억제 '*
'이 포함되어 있으며 끝에 달러가 필요합니다. 형식의 선행 공백은 공백을 건너 뜁니다.
이것은 보장 된 동작이 아닙니다. 첫 번째 변환은 out[1]
이상의 NUL을 쓰고 두 번째 변환은 out[1]
이상의 문자열을 쓰지만 C 표준은 그것이 작동한다는 것을 보장하지 않습니다. %s
는 "공백이 아닌 문자의 순서를"의미로 "$%s$"
의 두 번째 달러, 쓸모없는
#include <stdio.h>
int main(void)
{
char out[20];
scanf(" %1[$]%[^$]%*[$]", &out[0], &out[1]);
printf("<<%s>>\n", out);
return 0;
}
줄을 문자열로 읽은 다음 sscanf를 사용하여 fscanf를 사용중인 값을 가져올 수 있습니다. 그런 다음 원래 문자열과 sscanf의 값을가집니다.
참고. 따라서 달러는 이미 %s
에 의해 스캔됩니다. 처음에 %c
으로 초기 달러를 스캔하면됩니다. 이 시도 :
#include <stdio.h>
int main (void)
{
char out[64];
while (fscanf (stdin, " %c%62s", &out[0], &out[1]) == 2 && out[0] == '$') {
printf (">>%s<<\n", out);
}
return 0;
}
$ ./a.out
$fooo$
>>$fooo$<<
$bar$
>>$bar$<<
$baz $
>>$baz<<
$ boing $
>>$$<<
$ ./a.out
$zap$
>>$zap$<<
$ oink$
>>$oink$<<
^D
$
62 %62s
에서 초기 달러에 대한 공간을 확보하기 위해 sizeof out
이상의 작다는 것을주의하고 0