2017-04-07 7 views
4

나는 책을 읽고 문제를 풀고 있습니다. 문제는왜 "% d"은 (는) scanf에서 형식 문자열로 "% d"과 (와) 일치하지 않습니다

scanf 형식 문자열의 다음 쌍 각각에 대해

는 두 문자열은 동일 여부 를 표시합니다. 그렇지 않은 경우 을 어떻게 구별 할 수 있는지 표시하십시오.

(a) "%d"" %d" veruss

(b) "%d-%d-%d""%d -%d -%d"

(c) "%f""%f "

(d) "%f,%f" 내 용액이다

"%f, %f" 대 (a) 그들은 scanf d부터 동일합니다. 공백을 iscards. (b)에 대해서는 scanf-이고 공백이 이므로 일치하지 않습니다. (c)의 경우, 이들은 scanf이 버퍼의 공백을 되돌릴 것이므로 동등하지 않습니다. (d)에 대해서는 scanf이 공백을 버리기 때문에 동등합니다. Chegg 솔루션에 따르면 앞의 모든 질문은 동일하지 않습니다. 내가 잘못? 이 게시물에서 Chegg 솔루션과 비교하여 내 대답이 올바른지 확인하고자합니다. 나는 이미 책을 읽었으며 나는 scanf에 관한 지식이있다.

+1

[scanf와 상이한 포맷의 차이]의 가능한 복제 (http://stackoverflow.com/questions/38126126/difference-between-different-scanf-formats) – rsp

+1

@rsp , 정확히. 나는 이미 답을 주었다. 또한 Chegg 솔루션과 내 솔루션을 비교하고 있습니다. 또한 숙제 문제가 아닙니다. – CroCo

+0

@CroCo 목록 서식을 터프하게 읽는 텍스트 조각으로 되돌릴 수있는 이유는 무엇입니까? –

답변

0

옵션 (c) 추론을 약간 수정하면 정확합니다.

"scanf는 공백을 버퍼에 넣습니다."

이 가

정말 버전을 이해하지 않지만, 실제로 scanf() 그대로 제공되는 형식 문자열 입력과 일치하고, %f 변환 지정자와 함께, 하나의 비를 선도 공백이 필요 는 어떤으로를 일치시킬 비 공백 문자가 읽힐 때까지 공백 문자 수.

인용 C11 장 §7.21.6.2

공백 문자 (들)로 구성된 지시어 (읽지 남아 있음) 제 비 공백 문자까지 입력을 판독함으로써 실행된다 또는 더 이상 문자를 읽을 수 없게 될 때까지 을 읽으십시오. 지시문은 결코 실패하지 않습니다.

+0

(c)에서'scanf'는 사용자가 공백 문자가 아닌 문자를 입력 할 때까지 기다릴 것이므로이 책에서 이해할 수있는 옵션에 대한 나의 주장은 맞습니다. – CroCo

+0

''% d- % d- % d ''와''% d - % d - % d' '는 같지 않습니다. ''1 2 -3 ''의 입력 문자열은 전자에 의해 파싱되지 않지만 후자에 의해 해석 될 것입니다 – nos

+0

@nos Ahh, 나는 그것을 놓치고있는 것처럼 보입니다. –

1

"%d"" %d"은 OP의 추론에 따라 동일합니다.

확실히 예상 숫자 입력은 "123"" 456"과 동일합니다. 남아있는 고려 사항은 FILE 포인터가 "abc"" xyz"과 같이 실패 할 때 어디에 있습니까? "%d" 그 자체로, 첫 번째은 공백을 소비합니다. 차이는 없습니다.

...A 변환 사양은 다음 단계에서 실행됩니다 C11dr §7.21.6.2 7

입력 공백 문자가 ... 건너 뜁니다, 사양은 [, c, 또는 n 지정자를 포함하지 않는. 8

§7.21.6.2 다음 ("%d" 용) 숫자 입력 텍스트를 변환 발생한다.

아래 코드는 동등 함을 보여줍니다.

void next_testi(const char *s, const char *fmt, const char *pad) { 
    rewind(stdin); 
    int i = 0; 
    int count = scanf(fmt, &i); 
    int next = fgetc(stdin); 
    printf("format:\"%s\",%s count:%2d, i:%2d, next:%2d, text:\"%s\"\n", // 
     fmt, pad, count, i, next, s); 
} 

void next_test(const char *s) { 
    FILE *fout = fopen("test.txt", "w"); 
    fputs(s, fout); 
    fclose(fout); 

    freopen("test.txt", "r", stdin); 
    next_testi(s, "%d", " "); 
    next_testi(s, " %d", ""); 
    puts(""); 
} 

int main() { 
    next_test("3"); 
    next_test(" 4"); 
    next_test(""); 
    next_test(" "); 
    next_test("+"); 
    next_test(" -"); 
    next_test("X"); 
    next_test(" Y"); 
} 

출력

format:"%d", count: 1, i: 3, next:-1, text:"3" // scanf() return value 1:success 
format:" %d", count: 1, i: 3, next:-1, text:"3" 

format:"%d", count: 1, i: 4, next:-1, text:" 4" 
format:" %d", count: 1, i: 4, next:-1, text:" 4" 

format:"%d", count:-1, i: 0, next:-1, text:"" // scanf() return value EOF, next is EOF 
format:" %d", count:-1, i: 0, next:-1, text:"" 

format:"%d", count:-1, i: 0, next:-1, text:" " 
format:" %d", count:-1, i: 0, next:-1, text:" " 

format:"%d", count: 0, i: 0, next:43, text:"+" // scanf() return value 0 
format:" %d", count: 0, i: 0, next:43, text:"+" 

format:"%d", count: 0, i: 0, next:45, text:" -" 
format:" %d", count: 0, i: 0, next:45, text:" -" 

format:"%d", count: 0, i: 0, next:88, text:"X" 
format:" %d", count: 0, i: 0, next:88, text:"X" 

format:"%d", count: 0, i: 0, next:89, text:" Y" 
format:" %d", count: 0, i: 0, next:89, text:" Y"