scanf("%9s", line);
我从标准输入读取一行(最多9个符号),之后我想检查是否从用户输入中读取了所有字符。有没有优雅的方法呢?
答案 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
}