我的程序有什么问题(scanf,C ++)?

时间:2014-05-17 06:44:07

标签: c++ scanf

这个程序有什么问题?

#define _CRT_SECURE_NO_WARNINGS 
#include <cstdio> 
using namespace std; 
int N; 
char x[110]; 
int main() { 
    scanf("%d", &N); 
    while (N--) { 
        scanf("0.%[0-9]...", &x); 
        printf("the digits are 0.%s\n", x); 
    } 
    return 0; 
} 

这是VS 2013中的控制台应用程序,这是一个示例输入和输出:

输入:

1 
0.123456789... 

输出

the digits are 0.123456789 

但当我输入此输出时我得到:数字为0 我在Code :: Blocks和VS 2013中尝试过inputitng,手动和文本,但都没有工作。当手动输入时,程序不会等我输入N后输入数字。 我该怎么办?

2 个答案:

答案 0 :(得分:0)

替换

scanf("0.%[0-9]...", &x);

scanf(" 0.%[0-9]...", x);

您需要提供数组的起始位置x,而不是&x。此外,开头的空格将读取所有空格字符并忽略它。因此\n留下的scanf("%d", &N);会被忽略。

答案 1 :(得分:0)

循环中的scanf()失败,但您没有注意到。它失败了,因为它无法在文字0之前处理换行符。因此,通过添加空格来修复格式字符串,并通过测试scanf()的返回值来修复代码:

if (scanf(" 0.%[0-9]...", x) != 1)
    …oops — wrong format…

格式字符串中的空白跳过零个或多个空格字符;换行符(以及制表符和空格等)是空白字符。

您也不希望&位于x前面。严格来说,它会导致类型违规:%[0-9]需要char *,但您传递char (*)[100],这是一种完全不同的类型。但是,它恰好是相同的地址,因此您可以使用它,但正确的代码不应该这样做。