for循环不会在错误条件下终止

时间:2020-08-30 18:26:30

标签: arrays c loops for-loop

for循环应仅迭代5次,但第一个for循环应迭代6次,但秒在相同条件下可以正常工作。

    int i, j, n = 5;
    int *p;
    printf("enter size of array=");
    scanf("%d", &n);

    p = (int *)calloc(sizeof(int), n);  

    printf("enter array\n");

    for (i = 0; i < n; i++) {
        scanf("%d ", (p + i));
    }

    printf("array\n");

    for (j = 0; j < n; j++) {
        printf("%d ", *(p + j));
    }
    free(p);

3 个答案:

答案 0 :(得分:0)

两个循环的迭代次数取决于在提示enter size of array=上输入的第一个数字。

您应该更具防御性:拒绝无效输入并检测错误。

这是修改后的版本:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int i, n;
    int *p;

    printf("Enter array size: ");
    if (scanf("%d", &n) != 1 || n <= 0) {
        printf("invalid input\n");
        return 1;
    }

    p = (int *)calloc(sizeof(int), n);
    if (p == NULL) {
        printf("allocation failure\n");
        return 1;
    }

    printf("enter array\n");
    for (i = 0; i < n; i++) {
        if (scanf("%d ", (p + i)) != 1) {
            printf("invalid input\n");
            return 1;
        }
    }

    printf("array\n");
    for (i = 0; i < n; i++) {
        printf("%d ", *(p + i));
    }
    printf("\n");
    free(p);
    return 0;
}

答案 1 :(得分:0)

嘿@harsh,您在指针的观点上没有犯错。 但是问题是由scanf引起的。

因为您在%d之后提供了'_'(空格)(scanf(“%d”,(p + i))); 那么scanf将在每次出现提供的值之后始终查找一个空格(或任何空格字符),并重复搜索一次,因此最后一次将运行一次。

只需删除该空间,它将起作用。 希望这会有所帮助。

答案 2 :(得分:0)

scanf ("%d", (p+i))

即,不要在%d之后留空格

calloc的语法也应该

p =(int *)calloc(n,sizeof(int));