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

Sum*_*mit 3 c c++ printf scanf

我遇到了这个代码

输入:

3
0.1227...
0.517611738...
0.7341231223444344389923899277... 
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)

我无法理解几件事:

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

2.scanf中[0-9]后的那三个点...有什么作用?和

3.为什么我们不在 scanf 中的 [0-9] 之后使用任何格式说明符(在这种情况下为 d)?

use*_*023 9

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

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

在 [0-9] 之后的 scanf 中,这三个点有什么作用?

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

为什么我们不在 scanf 中的 [0-9] 之后使用任何格式说明符(在这种情况下为 d)?

%[]是格式说明符。有时称为扫描集。它存储字符。它可以是包容性的,也可以是排他性的。
%[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;
}
Run Code Online (Sandbox Code Playgroud)