4
scanf("%9s", line);

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

4

3 回答 3

3

feof()将允许您检查标准输入缓冲区是否为空。否则,如果您想进一步检查内容...使用类似的内容..

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

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

于 2013-05-26T17:21:22.097 回答
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
  }
于 2013-05-26T19:34:00.370 回答
0

您可以先将数据读入更大的字符串,然后再获取其长度。在某些时候,您只想摆脱输入缓冲区中留下的任何内容。为此,您可以在某些系统上使用 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
}
于 2013-08-07T17:18:01.453 回答