zyxzyx。 发表于 2022-12-8 22:04:24

scanf函数的问题

#include "stdio.h"
#include<stdlib.h>
int main()
{
        int n, a;
        int i, j, flag, std, sum = 0;
        scanf("%d", &n);
        for (i = 0; i < n; i++)
                scanf("%d", &a);
        scanf("%d", &std);
        for (i = 0; i < n; i++)
                if (a >= std)
                {
                        flag = 1;
                        for (j = 2; j < a; j++)
                                if (a % j == 0)
                                {
                                        flag = 0;
                                        break;
                                }
                        if (flag) sum += a;
                }
      
        printf("%d", sum);
    system("pause");
        return 0;
}
我在终端直接输入
4 2 3 4 5
4
就可以跳出结果,但是代码里有三个scanf函数,为什么第一个scanf的输入被跳过了。

jackz007 发表于 2022-12-8 22:04:25

本帖最后由 jackz007 于 2022-12-8 22:35 编辑

      没有被跳过,你输入的是:
4
2 3 4 5
4
      3 行键盘输入分别对应了 3 个 scanf()
      结果打印出数字 5, 就是正确答案。
      编译运行实况:
D:\\C>g++ -o x x.c

D:\\C>x
4 2 3 4 5
4
5
请按任意键继续. . .

TKXZ 发表于 2022-12-8 22:35:45

你输入的第一个4,就是赋给了n, 后面的2,3,4,5是分别赋值给了a, a, a, a, 最后一个4是赋值给了std.scanf输入可以以空格表示一次结束

li_zi 发表于 2022-12-8 22:35:45

这个程序是干啥的

铭凡 发表于 2022-12-8 22:37:11

本帖最后由 铭凡 于 2022-12-8 22:45 编辑

同问!

我的分析如下,理论输出5,但是输出的是15
#include "stdio.h"
#include<stdlib.h>
int main()
{
    int n, a;
    int i, j, flag, std, sum = 0;
    scanf("%d", &n);//第一次输入4,此时n==4;
    for (i = 0; i < n; i++)//循环4次;
    {
      scanf("%d", &a);//输入2 3 4 5,数组a={2, 3, 4, 5} ;
    }//该语句执行之后,i的值是4;
    scanf("%d", &std);//输入4 ,std==4;
    for (i = 0; i < n; i++)//i=0和1的时候,下面if语句不成立,i=2进入if语句; 这时候i=3了;
    {
      if (a >= std)//判断2 3 4 5中哪个数大于等于std==4,i=2进入if语句;
      {
            flag = 1;//对flag进行初始化,此时i==2;此时i==3
            for (j = 2; j < a; j++)//a==4;a == 5;
            {
                if (a % j == 0)//4 % 2 ==0, 跳出for循环 (注意是最里层的for循环);5%2 != 0,不执行
                {
                  flag = 0;
                  break;
                }
                if (flag)//;执行这个;
                {
                  sum += a;//;第二次的5%2!=0,所以跑到这里来了, 此时sum == 5
                }
            }
      }
    }
    printf("%d", sum);//按照这个道理,输出的sum行该是5啊emm
    system("pause");
    return 0;
}

铭凡 发表于 2022-12-8 22:46:31

jackz007 发表于 2022-12-8 22:31
没有被跳过,你输入的是:

      3 行键盘输入分别对应了 3 个 scanf()


为啥我输出的是15啊555

jackz007 发表于 2022-12-8 23:19:33

本帖最后由 jackz007 于 2022-12-8 23:32 编辑

铭凡 发表于 2022-12-8 22:46
为啥我输出的是15啊555

      不可能是 15,我用 tdm-gcc 5.1.0 和 VC9 分别编译的版本结果都是 5,你自己好好查查,是不是改别人的代码了,我是在坚决不改的情况下得到 5 的。
      我提示一下你,5 + 5 + 5 = 15,检查一下你的判断素数的位置,是不是在 j 循环以内(j == 2 、j == 3、j == 5 的时候各加了一次 a[ i ] = 5)???

铭凡 发表于 2022-12-8 23:34:03

本帖最后由 铭凡 于 2022-12-8 23:35 编辑

jackz007 发表于 2022-12-8 23:19
不可能是 15,我用 tdm-gcc 5.1.0 和 VC9 分别编译的版本结果都是 5,你自己好好查查,是不是 ...

你看下5楼的那个代码,我用的是这个,源代码是5,应该是我打了几个{}的问题

jackz007 发表于 2022-12-8 23:43:54

铭凡 发表于 2022-12-8 23:34
你看下5楼的那个代码,我用的是这个,源代码是5,应该是我打了几个{}的问题

          不需要仔细看,你的 if(flag) 显然在循环内!!!

铭凡 发表于 2022-12-9 00:51:01

本帖最后由 铭凡 于 2022-12-9 00:52 编辑

jackz007 发表于 2022-12-8 23:43
不需要仔细看,你的 if(flag) 显然在循环内!!!

明白了,谢谢

这东西真得多交流,自己看程序的时候,很多时候就想当然地给它们放一起了。刚才我还想反驳你,打了一大堆话,打到最后发现,我去,想明白了哈哈
页: [1]
查看完整版本: scanf函数的问题