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)?
为什么我们不使用 double 数组(因为输入值是 double)?
可以捕获输入double以及字符。double确实有有效数字的限制。无论出于何种原因,您的代码都将输入存储为字符。
在 [0-9] 之后的 scanf 中,这三个点有什么作用?
这三个点没有任何用途,除非它们是输入的一部分,然后在下一个scanf. 的输入0,123将被成功扫描0.123...。如果输入的是0.123abc在abc将输入流并导致在当前代码遗留问题。
为什么我们不在 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)
| 归档时间: |
|
| 查看次数: |
123 次 |
| 最近记录: |