SH1R0_HACKER
c언어에서 정수를 스페이스로 구분해서 배열에 저장하는 법 본문
걍 이렇게 쓰면 됨
scanf("%d", &n);
for(i=0; i<n; i++) {
scanf("%d", &arr[i]);
}
[설명]
scanf 의 동작은 좀 특이합니다. whitespace 라고 불리는 문자들(스페이스, 개행문자, 탭 등등)을 처리하는 방식 때문이죠.
scanf("%c", &ch); 같이 문자 하나만 읽어오는게 아닐 경우에, 즉, 정수나 문자열, 실수를 읽어오는 경우에.
whitespace 가 아닌 문자들이 나올 때까지 중간에 읽어들인 whitespace 문자들을 모두 버립니다. 그리고 whitespace 가 아닌 문자를 만나는 시점부터, 진짜 입력이 시작됩니다.
space 는 편의상 *로 표현하겠습니다. $는 엔터입니다. 둘 다 whitespace 문자들입니다.
입력이 이렇게 들어오고, 입력버퍼에 저장됩니다.
>>입력버퍼상태 : 132*22*3563*432*5$
프로그램에 이런 문장들이 있다고 칩시다.
scanf("%d", &a);
scanf("%d", &b);
scanf("%d", &c);
...
scanf("%d", &a); 문이 실행되면, 첫 문자를 검사합니다. '1'이네요? whitespace가 아니므로 여기부터 입력이 시작됩니다.
10진수로 인식할 수 있는 한 최대한 많이 버퍼에서 읽어들입니다.
1, 3, 2를 차례로 읽습니다. 그 다음에 나오는 space는 당연히, 10진수 표현에서 배제되므로 읽지 않습니다. (버퍼에 남겨집니다.)
그리고 읽어들인 수들로 실제 값을 알아내서 변수 a에 저장합니다.
>>입력버퍼상태 : *22*3563*432*5$
scanf("%d", &b); 문이 실행되면, 첫 문자를 검사합니다. space네요. whitespace는 버립니다. (어디에도 저장되지 않습니다.)
>>입력버퍼상태 : 22*3563*432*5$
다음 문자인 '2'가 whitespace 가 아니므로 여기부터 입력이 시작됩니다.
10진수로 인식할 수 있는 한 최대한 많이 버퍼에서 읽어들입니다. ...중략... 변수 b에 저장합니다.
>>입력버퍼상태 : *3563*432*5$
차례로 3563, 432 가 저장되고 이제,
>>입력버퍼상태 : *5$
이 상태로 왔습니다.
whitespace 버립니다. '5'는 숫자이므로 여기부터 입력이 시작됩니다. 그리고 다음 문자를 읽었더니 개행문자네요. 여기서 입력이 끝납니다.
>>입력버퍼상태 : $
최종적으로 입력버퍼에는 엔터만 남게 됩니다.
출처 : http://m.todayhumor.co.kr/view.php?table=total&no=7901303 | 작성자 MSG
'Programming Language > C' 카테고리의 다른 글
버블 정렬 (bubble sort) (0) | 2020.10.18 |
---|---|
EOF (END-OF-FILE) (0) | 2020.10.18 |
입력한 크기만큼 메모리를 할당하여 배열처럼 사용하기 (0) | 2020.10.18 |
논리 연산자 &&, ||, ! (0) | 2020.10.18 |
else if를 쓰는 이유 (0) | 2020.10.18 |