c++ - 我们不使用双数组是什么?

标签 c++ c printf scanf

我遇到了这段代码

输入:

3
0.1227...
0.517611738...
0.7341231223444344389923899277... 
int N; 
char x[110]; 
int main() {
scanf("%d\n", &N);
while (N--) { 
scanf("0.%[0-9]...\n", &x); 
printf("the digits are 0.%s\n", x);

而且我无法理解一些事情:

1.为什么我们不使用 double 数组(因为输入值是 双)?

2.这三个点有什么作用 ...在 [0-9] 之后的 scanf 中 服务?和

3.为什么我们不使用任何格式 说明符(在本例中为 d) [0-9] 在 scanf 中?

最佳答案

Why aren't we using a double array(since the input value is double)?

输入可以被捕获为 double以及人物。 double确实有有效数字的限制。无论出于何种原因,您的代码都将输入存储为字符。

What purpose do those three dots ... in scanf after [0-9] are serving?

这三个点没有任何用途,除非它们是输入的一部分,然后在下一个 scanf 之前最多删除三个点. 0,123 的输入将被成功扫描,0.123... .如果输入是 0.123abc abc将留在输入流中并导致当前代码出现问题。

Why are we not using any format specifier (d in this case) after [0-9] in scanf?

%[]是格式说明符。有时称为扫描集。它存储字符。它可以是包容性的,也可以是排他性的。
%[0-9]是包容的。它将接受数字。它将在第一个不是数字的字符处停止。
一个 d跟随说明符的行为与点相同。与 0.%109%[0-9]d , 0.123down 的输入将扫描 0.123d离开own在输入流中,以便稍后在当前代码中引起问题。
提供数组限制以防止向数组写入太多字符是一种很好的做法。对于 [110] 使用 %109[0-9] .这允许一个字符作为终止零。

编辑:代码示例

#include <stdio.h>

int N;
char x[110];

int main ( void) {
    scanf("%d\n", &N);
    while (N--) {
        scanf(" 0.%109[0-9]...", x);
        printf("the digits are 0.%s\n", x);
    }
    return 0;
}

关于c++ - 我们不使用双数组是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61192916/

相关文章:

c++ - Winsock - WSAConnect() 是否委托(delegate)给 connect()?

捕获输入作为输入(对于 int 和 char 变量)

c++ - 如何在 C++ 中打印出 BST

c++ - printf() 在 Xcode 4 调试期间间歇性停止打印

c++ - 用异构 boost::fusion vector 类型数据填充 std::vector

c++ - 将 Boost UBLAS blas-1 应用于矩阵

c++ - Boost 链接错误 undefined reference to GLIBCXX_3.4

c++ - 有比这更短的方式吗?(计算 C 中字符串中 char 的出现次数)

c - 连接套接字的最大数量与 SO_SNDBUF 和 SO_RCVBUF 的值

c - 为什么 printf 打印的内容大于数组的大小?