getchar()를 이해하려고 노력하고 있습니다!= EOF
저는 C 프로그래밍 언어를 읽고 있고 지금까지 모든 것을 이해했습니다.하지만 내가 우연히 만났을 때getchar()
그리고.putchar()
나는 그것들이 무엇을 사용하는지, 그리고 더 구체적으로 다음 코드가 무엇을 하는지 이해하지 못했습니다.
main()
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
}
나는 이해합니다.main()
함, 의 선언c
리고그고.while
프니다 . 하지만 저는 내부의 상태에 대해 혼란스럽습니다.while
루프. 이 C 코드의 입력은 무엇이고 출력은 무엇입니까?
이 코드는 다음과 같이 더 명확하게 작성할 수 있습니다.
main()
{
int c;
while (1) {
c = getchar(); // Get one character from the input
if (c == EOF) { break; } // Exit the loop if we receive EOF ("end of file")
putchar(c); // Put the character to the output
}
}
그EOF
문자는 더 이상 입력이 없을 때 수신됩니다.이 이름은 사용자 입력(파일의 특수한 경우)보다 실제 파일에서 입력을 읽는 경우에 더 의미가 있습니다.
[As an aside, generally the
main
function should be written as
int main(void)
.]
getchar()
는 표준 입력에서 문자를 읽는 함수입니다. EOF
는 C에서 파일의 끝에 도달했음을 나타내는 특수 문자입니다.
보통 당신은 받을 것입니다.EOF
아인온물에서 돌아온 .getchar()
표준 입력이 콘솔(즉, 파일)이 아닌 경우.
다음과 같이 유닉스에서 프로그램을 실행하는 경우:
$ cat somefile | ./your_program
당신의 그럼당신의.getchar()
는 든문자반환다니합를모의 모든 합니다.somefile
그리고.EOF
▁▁assomefile
끝. 끝.
프로그램을 다음과 같이 실행할 경우:
$ ./your_program
그고전송을 .EOF
( 콘을통때해(으)로 누름)CTRL+D
Ctrl+), (윈도우즈), Ctrl+Z(CTRL+Z),getchar()
은 will을 반환합니다.EOF
사형 집행이 끝날 겁니다
현재 C 표준으로 작성된 코드는 다음과 같아야 합니다.
#include <stdio.h>
int main(void)
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
}
루프는 다음과 같이 다시 작성될 수 있습니다.
int c;
while (1) {
c = getchar();
if (c != EOF)
putchar(c);
else
break;
}
라고 씌어 있습니다.
- 영원히 되풀이함
많은 프로그래밍 언어는 정상적인 프로그램 흐름을 깨는 예외를 발생시킴으로써 예외적인 조건을 처리합니다.C는 그런 일을 하지 않습니다.대신 실패할 수 있는 함수는 반환 값을 가지며 예외 조건은 지정된 함수의 문서에서 확인해야 하는 특별 반환 값으로 신호를 보냅니다.의 경우getchar
C11 표준의 문서는 (C117.21.7.6p3):
- 그
getchar
함수가 가리키는 입력 스트림의 다음 문자를 반환합니다.stdin
되고 "파일 종료 지시자"가 됩니다.getchar
아온다를 합니다.EOF
가 설정되고 " " " " " "이 설정됩니다.getchar
아온다를 합니다.EOF
.
라고 다른 곳에 명기되어 있습니다.EOF
는 <이며, - 는 < 0 인 정 상 이 며 수 임 일 반 값 환 은 반 의 입 의 다 니 수 0 - ▁0unsigned char
에 전혀 영향을 주지 않는.int
.
스트림이 파일 끝에 있다는 것은 모든 입력이 사용되었음을 의미합니다.표준 입력의 경우 UNIX/Linux 터미널에서 DZ+를 입력하고 Windows 콘솔 창에서 +를 입력하여 키보드에서 이 문제를 발생시킬 수 있습니다.또 다른 가능성은 프로그램이 키보드 대신 파일이나 파이프에서 입력을 수신하는 것입니다. 그러면 입력이 완전히 소비될 때마다 파일 끝이 신호를 보냅니다.
cat file | ./myprogram
또는
./myprogram < file
위의 단편에서 알 수 있듯이, 실제로는 두 가지 다른 조건이 있습니다.getchar
EOF
파일 끝에 도달했거나 실제 오류가 발생했습니다.이는 반환 값만으로는 추론할 수 없습니다.대신 기능을 사용해야 합니다.feof
그리고.ferror
.feof(stdin)
표준 입력에서 파일 끝에 도달한 경우 참 값을 반환합니다. ferror(stdin)
오류가 발생하면 true를 반환합니다.
발생한 errno
됩니다.<errno.h>
에는 오류 코드가 . 는 다음과 같습니다.perror
접두사를 사용하여 사람이 읽을 수 있는 오류 메시지를 자동으로 표시할 수 있습니다.을 서예제를다따수확있다습니장으로 할 수 .
#include <stdio.h>
#include <errno.h> // for the definition of errno
#include <stdlib.h> // for exit()
int main(void)
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
if (feof(stdin)) {
printf("end-of-file reached\n");
exit(0);
}
else if (ferror(stdin)) {
printf("An error occurred. errno set to %d\n", errno);
perror("Human readable explanation");
exit(1);
}
else {
printf("This should never happen...\n");
exit('?');
}
}
서는 Ctrl+D로 됨)를 합니다.^D
의 새 Linux 파일:
% ./a.out
Hello world
Hello world
^D
end-of-file reached
(여기서 입력이 라인 분할되어 출력과 함께 라인 내에서 입력이 인터리브되지 않도록 하는 방법을 설명합니다.)
마찬가지로 파이프라인을 사용하여 동일한 효과를 얻을 수 있습니다.
% echo Hello world | ./a.out
Hello world
end-of-file reached
오류를 트리거하는 것이 좀 더 까다롭습니다.bash
그리고.zsh
셸을 추가하여 표준 입력을 닫을 수 있으므로 아무 곳에서도 입력되지 않습니다.<&-
명령줄로:
% ./a.out <&-
An error occurred. errno set to 9
Human readable explanation: Bad file descriptor
잘못된 파일 설명자 또는EBADF
표준 입력 - 파일 설명자 번호 0이(가) 전혀 열리지 않았기 때문에 유효하지 않았음을 의미합니다.
오류를 생성하는 또 다른 재미있는 방법은 디렉터리에서 표준 입력을 읽는 것입니다. 이로 인해 errno가 다음으로 설정됩니다.EISDIR
Linux 버전:
% ./a.out < /
An error occurred. errno set to 21
Human readable explanation: Is a directory
는 사의반값은의 .putchar
또한 확인해야 합니다 - 마찬가지로 반환됩니다.EOF
오류 시 또는 다음 문자가 기록됩니다.
while ((c = getchar()) != EOF) {
if (putchar(c) == EOF) {
perror("putchar failed");
exit(1);
}
}
이제 표준 출력을 다음으로 리디렉션하여 테스트할 수 있습니다./dev/full
그러나 gotcha가 있습니다 - 표준 출력이 버퍼링되기 때문에 우리는 버퍼가 프로그램의 끝이 아닌 바로 플러시되도록 충분히 써야 합니다.우리는 무한한 제로 바이트를 얻습니다./dev/zero
:
% ./a.out < /dev/zero > /dev/full
putchar failed: No space left on device
추신: 항상 유형의 변수를 사용하여 반환 값을 저장하는 것이 매우 중요합니다.getchar()
문자를 읽어도 //unsigned
plain을 사용하는 것은 항상 잘못된 것입니다.
getchar() 함수는 키보드에서 문자를 읽습니다(즉,stdin
)
어진내 의조서 안에 에서.while
고리,getchar()
각 반복 되며, " " " " " 에 됩니다.c
.
C에서 제에 C서표입준력이은입이▁(▁now▁▁in▁standard▁c)을 .stdin
)는 파일과 같습니다.즉, 입력이 버퍼링됩니다.입력은 실제로 사용될 때까지 버퍼에 남아 있습니다. stdin
는 실제로 표준 입력 스트림입니다.
getchar()
입력 버퍼에서 다음으로 사용 가능한 값을 반환합니다.
프로그램은 기본적으로 키보드에서 읽은 내용을 표시합니다. 예를 들어, 다음과 같은 공백을 포함합니다.\n
line),새줄), 공등백등.
즉, 입력사키가, 를은드통입보다니력제)를 통해 제공하는 입니다.stdin
일반적으로 키보드를 의미합니다.그리고 그 결과물은 우리가 입력으로 제공하는 것입니다.
우리가 제공하는 입력은 문자별로 읽고 숫자로 줘도 문자로 처리됩니다.
getchar()
돌아올 것입니다EOF
파일 끝에 도달한 경우에만 가능합니다.된 '은 은파서우우는하 '파일'입니다.stdin
자체(표준 입력).
키보드를 통해 제공되는 입력이 저장되는 파일이 존재한다고 상상해 보십시오.은것입니다.stdin
이 '파일'은 무한 파일과 같습니다.안 돼요EOF
.
만약 우리가 그것보다 더 많은 정보를 제공한다면,getchar()
한 번에 처리할 수 있습니다(Enter 키를 눌러 입력으로 제공하기 전에). 추가 값은 여전히 사용되지 않은 입력 버퍼에 저장됩니다. 그getchar()
에서 첫 입에서첫번문읽자저고장다니에 합니다.c and print
cwith
char linde를 입력합니다.
반동는안되의 다음 .while
여분의 루프, 히존는이에 있습니다.stdin
다음 기간에 촬영됨while ((c = getchar()) != EOF)
c=getchar()
이제 입력 버퍼에 아무것도 남지 않을 때까지 동일한 프로세스가 반복됩니다.
이는마처럼 .putchar()
반복 중에 둘 이상의 문자가 입력으로 지정된 경우 한 번에 하나의 문자 대신 문자열을 반환합니다.
예: 입력이 다음과 같은 경우
abcdefghijkl
은 똑같았을
abcdefghijkl
이 동작을 원하지 않으면 fflush(stdin)를 추가할 수 있습니다.putchar(c);
이로 인해 루프는 각 반복 중에 제공된 입력의 첫 번째 문자만 인쇄합니다.
예: 입력이 다음과 같은 경우
adgbad
직오의a
인쇄됩니다.
입력이 다음으로 전송됩니다.stdin
Enter 키를 누른 후에만 표시됩니다.
putchar()는 의 반대입니다.getchar()
스트림에 합니다.stdout
일반적으로 모니터).
EOF
파일에 있는 문자가 아닙니다.함수가 에러 코드로 반환한 것입니다.
기브에서 나갈 수 없을 거예요.while
하지만 정상적으로 루프합니다.입력 버퍼는 키보드를 통해 입력 버퍼로 들어오는 즉시 비워집니다(출력 표시용).stdin
주지EOF
.
루프를 수동으로 종료하는 경우EOF
Linux에서 +를 D누르면 키보드를 사용하여 전송할 수 있습니다.
ctrl윈도에서Z
예:
while ((c = getchar()) != EOF)
{
putchar(c);
fflush(stdin);
}
printf("\nGot past!");
키 을 누 다 같 표 이 시 니 됩 다 과 음 조 면 르 합 다 니 ▁if 됩 표 ▁give ▁comb ▁the 시 ▁key ▁you ination ▁to ▁pressEOF
는 Got past!
프로그램을 종료하기 전에 표시됩니다.
한다면stdin
이미 비어 있지 않습니다. 이 키 조합을 두 번 눌러야 합니다.이 버퍼를 지우고 시뮬레이션합니다.EOF
.
편 주위에 쌍: 주의추괄호쌍가c = getchar()
while ((c = getchar()) != EOF)
에 의해 반환되는 값을 확인하는 것입니다.getchar()
에 처에됨에 할당됩니다.c
그 값이 와 비교되기 전에EOF
.
이 괄호가, 그 만이추괄없면다었가, 로효은과으적식표현호약가▁로▁if▁would▁been가 되었을 것입니다.while (c = (getchar() != EOF) )
그것은 그것을 의미했을 것입니다.c
개의 중 를 가질 수 .1
) 또는 (참으로) 또는.0
(거짓에 대한) 의도된 것이 아닌 것이 분명합니다.
명령줄에 -1을 입력해도 프로그램이 종료되지 않는다는 사실에 혼란을 겪었을 수도 있습니다. ㅠㅠgetchar()
, - 및 와 1의로 읽습니다.c에 할당할 때 문자는 ASCII 숫자 값으로 변환됩니다. 메모리되며, cc.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.
그리고나서putchar(c)
이 값을 검색하고 ASCII 테이블을 검색한 다음 다시 인쇄된 문자로 변환합니다.
ASCII 테이블에서 -1 소수 값을 찾는 것은 불가능할 것 같습니다. 테이블이 0부터 시작하기 때문입니다.그렇게getchar()
다양한 플랫폼에서 다양한 솔루션을 설명해야 합니다. 아마도.getchar()
각 플랫폼의 버전은 무엇입니까?
이 EOF가 정규 ASCII가 아닌 것이 이상할 뿐입니다.그것은 인쇄할 수 없는 첫 번째 문자 중 하나일 수 있습니다.예를 들어, 회선 끝은 ASCII에 있습니다.
Windows에서 Linux로 파일을 전송하면 어떻게 됩니까?EOF 파일 문자가 자동으로 업데이트됩니까?
getchar()
입력에서 문자를 가져옵니다.
c = getchar()
이 할당 값은 할당 후 왼쪽 값 또는 읽은 문자 값입니다. 값 값EOF
으로 입니다.-1
.
((c = getchar()) != EOF)
▁than▁something가 아닌 다른 으로 유지되는 한.EOF
즉, 조건이 참으로 유지되는 한 루프는 계속 반복됩니다. 값이 일단그가 되면,EOF
전체 조건의 값은 다음과 같습니다.0
그러면 고리가 끊어질 겁니다
괄호가 주변의 c = getchar()
가▁you▁are것,다,▁wanted▁it▁for▁assumes▁the▁compiler▁we입니▁really▁condition▁toment▁type▁usually▁that▁to▁because▁emphasize▁inside▁wanted한▁▁an▁do▁to▁the강을 입력하고 싶었다고 가정하기 때문에, 우리가 조건 안에서 정말로 할당을 하고 싶었다는 것을 강조하기 위한 것입니다. 왜냐하면 그것은 보통 당신이 입력하기를 원한다고 가정하기 때문입니다.==
그리고 경고합니다.
main() {
int c;
while ((c = getchar()) != EOF)
putchar(c);
}
그래서 전체 코드는 실제로 여러분이 입력한 것을 반향시킵니다.을 문의값할니다합당을자에 할당합니다.c
파일의 끝이 감지될 때만 종료되는 상태로, 조건 내부에서 다시 루프 본체로 출력합니다.
위의 | 파이프 명령과 유사한 방식으로 시스템에서 리디렉션을 사용하여 파일이 일반적으로 CTRL-Z 또는 CTRL-D로 표시되는 끝(EOF)에 도달할 때까지 위의 코드를 사용하여 파일의 모든 문자 내용을 표시할 수 있습니다.
콘솔:ProgramName < FileName1.txt
을 수행하십시오. "FileName1"과 같은 파일이 있습니다.ProgramName < FileName1.txt > CopyOfInput.txt
이것은 여러분의 이해를 돕기 위해 여러분의 프로그램을 여러 가지 방법으로 보여줍니다.
도움이 되길 바랍니다.
main(){
int c;
while ((c = getchar()) != EOF)
putchar(c);
}
실제로 c=getchar()는 사용자가 콘솔에 입력하는 문자를 제공하며 해당 값은 파일의 끝을 나타내는 EOF로 확인됩니다. EOF는 파일의 마지막에 발생합니다.(c = getchar())!= EOF는 c!= EOF와 동등합니다. 이제 이것이 훨씬 쉬울 것 같습니다. 추가 문의가 있으시면 알려주세요.
언급URL : https://stackoverflow.com/questions/10720821/im-trying-to-understand-getchar-eof
'programing' 카테고리의 다른 글
Apache POI 삽입 이미지 (0) | 2023.06.15 |
---|---|
MySQL 및 MariaDB가 앰퍼샌드를 포함하는 문자열을 데이터베이스에서 볼 수 있을 때 보고하지 않음 (0) | 2023.06.15 |
HTML 양식을 jQuery를 통해 제출하지 않고 강제로 유효성을 검사하는 방법 (0) | 2023.06.10 |
클라우드 기능과 파이어베이스 기능의 차이점은 무엇입니까? (0) | 2023.06.10 |
Python 스크립트에서 암호 숨기기(안전하지 않은 난독화만 해당) (0) | 2023.06.10 |