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

What's wrong with my program (scanf, C++)?

本文关键字:C++ scanf 程序 什么 问题 我的      更新时间:2023-10-16

这个程序有什么问题?

#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.%sn", x); 
    } 
    return 0; 
} 

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

输入:

1 
0.123456789... 

输出
the digits are 0.123456789 

,但是当我输入this到this时,我得到的输出是:数字是0我曾尝试输入和手动和文本,在Code::块和VS 2013,但都没有工作。手动输入时,我输入N后,程序不会等我输入数字。我该怎么办?

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

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

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

您也不希望&x前面。严格地说,它会导致类型冲突:%[0-9]期望一个char *,但你传递了一个完全不同类型的char (*)[100]。然而,它恰好是相同的地址,所以你可以这样做,但正确的代码不应该这样做。

Replace

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

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

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

相关文章: