许多人说,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()可能无法读取整个行,在"严肃"程序中,这当然是你应该考虑的.

C++相关问答推荐

海湾合作委员会是否保证大小匹配的访问?

try 使用sigqueue函数将指向 struct 体的指针数据传递到信号处理程序,使用siginfo_t struct 体从一个进程传递到另一个进程

有效地计算由一组点构成的等边三角形和等腰三角形的数量

为什么这个C程序代码会产生以下结果?

当main函数调用被重构时,C函数给出错误的结果

在C中使用动态内存分配找到最小的负数

将fget()与strcMP()一起使用不是正确的比较

有没有可能我不能打印?(C,流程)

struct -未知大小

SSH会话出现意外状态

在每种If-Else情况下执行语句的最佳方式

这个C程序在工作中途停止获取输入.我收到分段故障(核心转储).我还是不知道问题出在哪里

GTK函数调用将完全不相关的char* 值搞乱

按长度对argv中的单词进行排序

仅从限制指针参数声明推断非混叠

如何使用空元素块声明指针数组

浮点正零何时不全为零?

关于不同C编译器中的__attribute__支持

使用 c 中的 write() 函数将非 ASCII 字符写入标准输出

多行表达式:C 编译器如何处理换行符?