代码之家  ›  专栏  ›  技术社区  ›  San Mo

当输入为-1时终止数组输入,而不使用break?

  •  1
  • San Mo  · 技术社区  · 7 年前

    我在循环中使用scanf在长度为100的数组中获取输入。在20个数字之后,如果我输入-1,我希望循环退出,即完成输入并继续程序的其余部分。我正在做这样的事情

    for(i=0;i<100;i++)
    {
        scanf("%d", &input[i]);
        if(input[i] == -1)
        {
            break;
        }
    }
    

    我听说,使用break语句是不好的做法,即使这段代码工作得很好。所以我想知道,当 -1 已输入。我试过了

    for(i=0;scanf("%d",&input[i])!=-1;i++)
    

    而且

    fori(i=0;i<100;i++){
        do
    {scanf("%d", &input[i]);
    }while(input[i]!=-1
    }
    

    这两个都不起作用

    5 回复  |  直到 7 年前
        1
  •  3
  •   Antti Haapala -- Слава Україні    7 年前

    第二个表达式 for 循环是一个自由形式的布尔表达式。在里面 如果是你 能够 在那里添加您的条件。然而,在这种情况下,它看起来并不太好。例如

    for(i=0; i < 100 && (i < 1 || input[i - 1] != -1); i++)
    {
        scanf("%d", &input[i]);
    }
    

    一、 e.如果我们已经输入了一个值,请检查该值,该值必须等于 -1 让循环继续

    另一种方法是使用合成标志变量:

    int loop_again = 1;
    for (i = 0; loop_again && i < 100; i++) {
        scanf("%d", &input[i]);
        if(input[i] == -1)
        {
            loop_again = 0;
        }
    }
    

    总的来说,这两个看起来都比仅仅使用 break 对发明它的目的的陈述。

    注意,您还应该检查 scanf 它本身

        2
  •  1
  •   gsamaras a Data Head    7 年前

    使用是不好的做法 break 声明

    正如古希腊人所说,“泛美通亚里士多德”,这意味着与平衡一起使用的一切都是伟大的。这在这里也适用,您的代码也很好。唯一需要担心的是 不检查返回值 属于 scanf()

    现在,如果你真的坚持要改变你的方法,那么请参考哈帕拉的回答,我们首先到达了那里。

        3
  •  1
  •   ad absurdum    7 年前

    你可以使用 while 循环并检查 -1 在循环条件中输入。请注意,您应该 总是 检查返回的值 scanf() . 在发布的代码中,非数字输入导致没有值存储在 input[] ; 如果代码试图使用不确定的值,这可能会导致以后出现未定义的行为。

    这里有一个例子。注意,循环条件首先检查数组索引是否增长过大,然后检查 scanf() 确保输入了一个数字,然后检查是否 已输入。在非数字输入的情况下,循环终止。

    #include <stdio.h>
    
    #define INPUT_SZ  100
    
    int main(void)
    {
        int input[INPUT_SZ];
        size_t i = 0;
    
        while (i < INPUT_SZ && scanf("%d", &input[i]) == 1 && input[i] != -1) {
            ++i;
        }
    
        puts("You entered:");
        for (size_t j = 0; j < i; j++) {
            printf("%d\n", input[j]);
        }
    
        return 0;
    }
    

    样本交互:

    2 4 6 8 -1
    You entered:
    2
    4
    6
    8
    
        4
  •  1
  •   Verma Aman    7 年前

    您只需将计数器变量的值更改为max,它就会自动退出循环。

    #include<stdio.h>
    
    #define MAX 10
    
    int main()
    {
        int ar[MAX], i, count;
        for(i=0; i<MAX; i++)
        {
            scanf("%d", &ar[i]);
            if(ar[i]==-1)
            {
                count=i--;         //this is your new MAX. Not mandatory but will be useful if you need to access array elements
                i=MAX;
            }
        }
    
        //printing array
        for(i=0; i<count; i++)
        {
            printf("Element %d: %d\t", i+1, ar[i]);    
        }
        return 0;
    }
    

    希望这有帮助。

        5
  •  -1
  •   sjsam    7 年前

    使用 do-while

    int i=0;
    do{
    if(scanf("%d", &input[i++]) != 1)
    {
       if(i>0)
          --i; // Decrementing i if an integer is not provided
       int ch;
       while ((ch = getchar()) != '\n' && ch != EOF) // Wasting the buffer
       ;   
    }
    }while(input[i-1] != -1 && i<=99);