scanf("%9s", line);
stdin (최대 9 개 기호)에서 한 줄을 읽은 후 사용자 입력에서 모든 문자를 읽었는지 확인하고 싶습니다. 그것을 할 우아한 방법이 있습니까?scanf 이후 몇 개의 문자가 stdin에 남아 있는지 확인하는 방법은 무엇입니까?
scanf("%9s", line);
stdin (최대 9 개 기호)에서 한 줄을 읽은 후 사용자 입력에서 모든 문자를 읽었는지 확인하고 싶습니다. 그것을 할 우아한 방법이 있습니까?scanf 이후 몇 개의 문자가 stdin에 남아 있는지 확인하는 방법은 무엇입니까?
feof()
표준 버퍼가 비어 있는지 확인할 수 있습니다. BUF의 데이터 BUFSIZ 바이트를 저장할 배열/문자열이 될 것입니다 다른 사람은 더 나아가 내용을 확인 ... 이런 식으로 뭔가를 사용하려면 .. 여기
while (fgets(buf,BUFSIZ,stdin) != NULL)
{ printf("%s",buf); }
feof()는 0을 계속 반환합니다. 아마도 나쁜 방법으로 문자열을 읽는 중입니까? feof()가 모든 것을 읽은 후 하나와 같지 않게하는 방법의 예가 될 수 있습니까? – user1242967
콘솔에서
것은에서 인간의 입력을 분리 추천 파싱. 사람들은 예기치 않은 문자를 입력합니다. 그리고 변하지 않는이 문제를 올바르게 처리하는 것이 더 쉽다는 것을 알았습니다. 라인에
읽기
char buf[1024];
char *retval;
retval = fgets(buf, sizeof(buf), stdin);
// if I/O trouble reading ...
if (!retval) {
handle error
}
// if End-of-line missing (as buffer was filled) ...
if (!strchr(buf, '\n')) {
handle error
}
// Toss '\n'
buf[strlen(buf) - 1] = '\0';
그런 다음
sscanf(buf, "%9s", line);
if (strlen(buf) > 9) {
// You have extra data
}
'retval = strchr (buf, '\ n')) == 0) {... handle error ...} * retval = '\ 0';'입력의 두 번째 스캔을 피한다. newline이 어디에 있는지 이미 알고있을 때 문자열. –
@Jonathan Leffler는 정확합니다. 보통 나는 이것을 반대로하고 문자열 길이를 찾고,> 0인지 확인한 다음 마지막 문자가 \ n이면 삭제합니다. 그러나 그 접근법은 덜 명확 해 보입니다. – chux
Yup :'strlen()'또는'strchr()'을 사용할 수 있지만,이 문맥에서 둘 다 사용할 필요는 없습니다. 그러나 일반적인 접근법은 정확합니다. 'fgets()'와 일반적으로 더 나은 분석이 있습니다. 그럼에도 불구하고'feof()'는'fgets()'가 0을 리턴 할 때까지는 true를 리턴하지 않을 것입니다. 다음 읽기가 아무것도 리턴하지 않을 때를 알지 못합니다. 마지막 읽기가 아무것도 반환하지 않았을 때를 알 수 있습니다. –
먼저 더 큰 문자열로 데이터를 읽고 나중에 길이를 얻을 수있는 데이터를 구문 분석 (I가 자신의 기능을 넣어이) . 어떤 시점에서 입력 버퍼에 남겨진 것이 무엇이든 없애고 싶습니다. 일부 시스템에서는 fflush를 사용하고 다른 모든 시스템에서는 fpurge를 사용할 수 있습니다.
다음은 큰 버퍼를 채우고 나머지 버퍼를 제거하는 데 사용할 수있는 몇 가지 샘플 코드입니다. 청소 기능은 특수 문자가있는 경우 마지막 줄 바꿈을 제거하거나 문자열을 일찍 종료합니다.
void userInput(char * str, int size);
void get(char * str, int size);
void clean(char * str, int size);
void flush(void);
void userInput(char * str, int size)
{
get(str, size);
clean(str, size);
flush();
}
void get(char * str, int size)
{
memset(str, 0, size);
fgets (str, size, stdin);
}
void clean(char * str, int size)
{
char * c;
str [size -1] = 0;
c = str;
while(*c >= ' ' || *c < 0) ++c;
*c = 0;
}
void flush(void)
{
//the ifdef approach does not work in reality.
//this is a pseudo case for your benefit.
#ifdef fpurge
fpurge(stdin);
#else
fflush(stdin);
#endif
}
fflush가 stdin에서 올바르지 않습니다. – rationalcoder
'feof()'를 시도 했습니까? –
feof (stdin)를 의미합니까? 방금 시도했는데 어떤 길이의 문자열을 입력했는지 상관없이 0을 반환합니다. – user1242967
'feof (stdin)'은 내가 입력 한 길이에 관계없이 0을 반환합니다. - 다음 I에서 읽을 수있는 개행 문자가 있음을 알려줍니다./O operation ... 최종 줄 바꿈없이 EOF를 만나면 아무런 데이터도 남지 않을 것입니다. –