如何检查scanf后stdin中是否还有一些字符?

时间:2013-05-26 16:50:08

标签: c stdin scanf

scanf("%9s", line);

我从标准输入读取一行(最多9个符号),之后我想检查是否从用户输入中读取了所有字符。有没有优雅的方法呢?

3 个答案:

答案 0 :(得分:3)

feof()将允许您检查stdin缓冲区是否为空。如果你想进一步检查内容......请使用类似的东西..

while ( fgets(buf,BUFSIZ,stdin) != NULL ) 
  {     printf("%s",buf); }

这里buf将是保存BUFSIZ数据字节的数组/字符串

答案 1 :(得分:1)

建议将人工输入与解析分开。人们输入最意外的字符。并且我发现单独正确处理这些问题更容易。

读入行(这是我自己的功能)

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
  }

答案 2 :(得分:0)

您可以先将数据读入更大的字符串,然后再获取其长度。 在某些时候,你想要摆脱输入缓冲区上剩下的任何东西。 要做到这一点,你可以在某些系统上使用fflush,在其他系统上使用fflge。

以下是一些示例代码,您可以使用这些代码填充大缓冲区并清除其余缓冲区。如果有任何特殊字符,清理功能将删除最终换行符或提前结束字符串。

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
}