许多人说,scanf
不应该用在"更严肃的计划"中,就像getline
一样.
我开始不知所措:如果我遇到的每个输入函数都有人说我不应该使用它们中的任何一个,那么我应该使用什么呢?有没有更"标准"的方式来获取我不知道的信息?
许多人说,scanf
不应该用在"更严肃的计划"中,就像getline
一样.
我开始不知所措:如果我遇到的每个输入函数都有人说我不应该使用它们中的任何一个,那么我应该使用什么呢?有没有更"标准"的方式来获取我不知道的信息?
一般来说,fgets()
被认为是一个不错的 Select .它将整行数据读入缓冲区,从那里你可以做你需要的事情.如果想要scanf()
这样的行为,可以将读取的字符串传递给sscanf()
.
这样做的主要优点是,如果字符串无法转换,则很容易恢复,而对于scanf()
,您只剩下stdin
上的输入,需要将其耗尽.此外,你也不会陷入将面向行的输入与scanf()
混合的trap ,这会让人头疼,因为像\n
这样的东西会留在stdin
上,这通常会导致新的程序员认为输入调用被完全忽略.
这样的事情可能会让你喜欢:
char line[256];
int i;
if (fgets(line, sizeof(line), stdin)) {
if (1 == sscanf(line, "%d", &i)) {
/* i can be safely used */
}
}
上面您应该注意到fgets()
在EOF或error时返回NULL
,这就是为什么我将其包装为if
.sscanf()
调用返回成功转换的字段数.
请记住,如果行大于缓冲区,fgets()
可能无法读取整个行,在"严肃"程序中,这当然是你应该考虑的.