卡在for循环中,用C语言将值输入数组

时间:2018-11-14 12:10:58

标签: c arrays loops for-loop scanf

我试图通过编写冒泡排序程序来与C一起练习。直到现在的问题似乎是,在不再满足条件但似乎未在循环中执行命令之后,为数组的单元格赋值的for循环被卡住了。我不知道到底发生了什么,我添加了一些额外的代码来查看正在发生的事情,这些都是我的结论。这是代码:

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

void swap(int *x, int *y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}

int *sort(int *array)
{
    int finish = 1;
    while (finish = 1)
    {
        finish = 0;
        for (int i = 0; i <= sizeof(array); i++)
        {
            if ((array + i) > (array + i + 1))
            {
                swap(array + i, array + i + 1);
                finish = 1;
            }
        }
    }
    return array;
}
int main()
{
    int s, res;
    printf("Give me the size of the array being sorted(larger than 1) : ");
    do
    {
        res = scanf("%d", &s);
        if (res != 1)
        {
            printf("Wrong Input!\n");
            exit(1);
        }
        if (s < 2)
            printf("Only numbers equal or larger than 2\n");

    } while (s < 2);
    int array[s];
    for (int i = 0; i < s; i += 1)
    {
        scanf("%d", array + i);
        printf("%d %d %d\n\n", *(array + i), i, i < s); // I used this to check if my values were ok
    }
    printf("end of reading the array"); //I added this line to see if I would exit the for loop. I am not seeing this message
    sort(array);
    printf("\n");
    for (int i = 0; i < sizeof(array); i++)
        printf("%d\n\n", array + i);
    printf("Array has been sorted! Have a nice day!\n\n************************************************************");
    return 0;
}

3 个答案:

答案 0 :(得分:3)

请参见代码中的注释:

#include <stddef.h>  // size_t  1)
#include <stdio.h>
#include <stdlib.h>

void swap(int *x, int *y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}

int *sort(int *array, size_t size)  // needs an extra parameter to know the size of the array
{
    int finish = 1;
    while (finish /* = 1 * you don't want assignment, you want comparison: */ == 1)
    {
        finish = 0;
        for (int i = 0; i /* <= sizeof(array) */ < size - 1; i++)  // i should be of type size_t
        {
            // if ((array + i) > (array + i + 1)) you are not dereferencing:
            if(array[i] > array[i + 1]) 
            {
                // swap(array + i, array + i + 1);  // easier to read imho:
                swap(&array[i], &array[i + 1]);
                finish = 1;
            }
        }
    }
    return array;  // why does this function return anything? it is never used.
}
int main()
{
    int s; /* , res;  no need for an extra variable res */
    printf("Give me the size of the array being sorted(larger than 1) : ");
    do
    {
        // res = scanf("%d", &s);
        // if (res != 1)
        if (scanf("%d", &s) != 1)
        {
            printf("Wrong Input!\n");
            // exit(1);  // should be EXIT_FAILURE. Use return instead of exit() when in main().
            return EXIT_FAILURE;
        }
        if (s < 2)
            printf("Only numbers equal or larger than 2\n");

    } while (s < 2);
    int array[s];
    for (int i = 0; i < s; /* i += 1* idiomatic: */ ++i)  // size_t would be the correct type for s and i.
    {
        scanf("%d", /* array + i  use indexes: */ &array[i]);
        printf("%d %d %d\n\n", array[i], i, i < s);  // again: indexes. i < s is allready ensured by the condition of the for-loop
    }
    printf("end of reading the array");
    // sort(array);  // sort will have no idea about the size of array use
    sort(array, s); // instead.

    printf("\n");
    for (int i = 0; i < /* sizeof(array) 2) */ s; i++)
        printf("%d\n\n", /* array + i * again you don't dereference */ array[i]);
    printf("Array has been sorted! Have a nice day!\n\n************************************************************");
    return 0;
}

1)size_t是保证足够大以容纳所有大小的对象并在其中建立索引的类型。 scanf()的转换说明是"%zu"

2)sizeof(array)中的main()将产生array中的字节数,但是您需要元素数,因此必须使用sizeof(array) / sizeof(*array)。但这不是必需的,因为您已经知道它的大小。是s

答案 1 :(得分:0)

此行

printf("end of reading the array");

在字符串末尾没有换行符。这是一个问题,因为printf是称为“缓冲IO”的功能家族的一部分。 C库维护着您要打印的内容的缓冲区,并且仅在缓冲区已满或在字符流中遇到\n时才将它们发送到终端。在打印换行符之前,屏幕上不会显示end of reading the array。您只能在调用sort() 执行此操作。因此,您所知道的是您的程序在sort结束之前的某个时刻陷入了无限循环。

因此实际上存在三个可能无限的循环:您标识的for循环,while中的sort循环和{{1内的for循环}}循环。正如其他答案所指出的那样,您犯了一个经典错误,即在while条件

中使用赋值
while

除非您的C编译器确实很老,否则它可能会在该行上输出警告。您应该注意警告。

此外,您应该学习而不是以后使用调试器。相信我,它将为您节省很多查找错误的时间。

答案 2 :(得分:-1)

在排序函数sizeof(array)中返回指针的大小。 (您可以使用printf("%d", sizeof(array)自行检查。

解决方案是将您的功能更改为:

int sort(int* array, size_t size) { ... }

并使用正确的数组大小调用它:

sort(array, s);