【问题标题】:C - Break while loop when typing the number 0 into a vectorC - 在向量中输入数字 0 时中断 while 循环
【发布时间】:2018-11-08 23:36:26
【问题描述】:

我有这个简单的代码,它将终端中输入的数字插入到每个循环的向量位置。

int main() 
{
    int vector[5];
    int i;

    for (i = 0; i < 5; i++)
    {
        printf("Number: ");
        scanf_s("%d", &vector[i]);
    }

    system("pause");
    return 0;
}

我的问题是如何在输入数字 0 后立即中断循环。

例如,假设我的向量有 50 个位置,我输入 10 个正整数位置,现在我希望在输入零时循环结束,其余 40 个位置保持空白。

我想它与 while 循环有关,但我什至无法接近我想要的结果。

【问题讨论】:

  • 在将其写入vector[i] 之前检查该值。如果它是 0,那么 break.. 或者保留你所拥有的并简单地添加 if (vector[i] == 0) break;。取决于您是否将 0 设为 vector[i]

标签: c loops for-loop while-loop


【解决方案1】:
#define MAX_SIZE (5)

int main() 
{
    int vector[MAX_SIZE] = {0};
    int i;

    memset(vector, 0xFF, sizeof(vector)); //sets all vector[i] to -1 on init;
    for (i = 0; (i < MAX_SIZE) && (i?vector[i-1]:1) ; i++) //you can add the condition to break from the for loop here.  This is more complicated but its just for demonstration.
    {
        printf("Number: ");
        scanf_s("%d", &vector[i]);
    }

    system("pause");
    return 0;
}

上面的示例代码演示了使用 for 循环条件表达式作为中断循环的方法。由于您构建循环的方式,那里的三元组可防止 i=0 导致索引越界的情况。更好/更易读的方式如下:

#define MAX_SIZE (5)

int main() 
{
    int vector[MAX_SIZE] = {0};
    int i;

    memset(vector, 0xFF, sizeof(vector)); //sets all vector[i] to -1 on init;

    for (i = 0; i < MAX_SIZE; i++)
    {
        printf("Number: %d\n", i);
        scanf_s("%d", &vector[i]);
        if(vector[i] == 0)
        {
            break;
        }
    }

    //system("pause");
    printf("Broke the loop when i was %d\n", i);
    return 0;
}

除了可读性之外,两者之间的区别在于 i 将在第一个中增加一个额外的时间。另外,请确保初始化您声明的所有变量(所有向量元素都是堆栈垃圾,0xFF memset 将它们全部分配给-1)。

【讨论】:

  • {-1} 将分配向量[0] = -1;向量[1] = 0;向量[2] = 0;等等。在数组赋值中未显式初始化的每个元素默认分配为 0。因此,{0} 将 0 分配给每个元素,然后 memset 将每个字节分配 0xFF(因为它们是有符号整数)最终为 -1。
  • 如果你使用 memset,为什么还要费心去初始化数组呢?
  • @GermanNerd 在第二个示例中是未使用和多余的,在第一个示例中也是多余的。我总是初始化我声明为习惯的任何东西,你不能将#defined SIZE 的数组初始化为除 {0} 之外的任何东西,可以维护。如果要更改 SIZE,则必须更改初始化 {-1,-1,-,1.etc} 以获得新的 SIZE -1。
猜你喜欢
  • 1970-01-01
  • 2016-11-19
  • 2017-11-14
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
  • 2013-06-26
  • 2021-06-25
相关资源
最近更新 更多