scanf("%9s", line);
我从标准输入中读取了一行(最多 9 个符号),然后我想检查是否从用户输入中读取了所有字符。有什么优雅的方法吗?
feof()
将允许您检查标准输入缓冲区是否为空。否则,如果您想进一步检查内容...使用类似的内容..
while ( fgets(buf,BUFSIZ,stdin) != NULL )
{ printf("%s",buf); }
这里 buf 将是保存 BUFSIZ 字节数据的数组/字符串
建议将人工输入与解析分开。人们输入最意想不到的字符。并且不变,我发现单独正确处理这些问题更容易。
读入行(我把它放在自己的函数中)
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
}
您可以先将数据读入更大的字符串,然后再获取其长度。在某些时候,您只想摆脱输入缓冲区中留下的任何内容。为此,您可以在某些系统上使用 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
}