计算除 0 以外的不同数字 (C) 在不同编译器中输出不同

标签 c

我试图从输入中查找不等于 0 的不同数字的数量。n 在 1-100 范围内。数组中的数字范围为 0-600。 http://codeforces.com/problemset/problem/937/A 针对这个问题,我写了一段代码:

#include <stdio.h>
#include <string.h>

int main(void)
{
    int n, count = 0, i;

    scanf("%d", &n);

    int ar[n], ar2[601];
    memset(ar2, 0, 600 * sizeof(int));

    for (i = 0; i < n; i++) {
        scanf("%d ", &ar[i]);
        if (ar2[ar[i]] == 0)
            ar2[ar[i]] = 1;
    }

    for (i = 1; i < 601; i++) {
        if (ar2[i] != 0)
            count++;
    }

    printf("%d",count);
    return 0;
}

对于第一个测试用例 (4 1 3 3 2),它在 ideone.com 的 gcc 6.3 中输出正确答案 3,但在 codeforces 使用的 gcc 5.1 中输出正确答案 4。

为什么会发生这种情况,如何防止这种情况发生? (我认为这是因为 memset,但我不确定。)

最佳答案

您正在定义一个大小为 n 的数组在 n 的值之前已确定(请注意,您 scanf 之后的 n 的值)。这是未定义的行为,因此不同的编译器可能会给出不同的结果,甚至在您的计算机上启动程序也可能会给出不同的结果(包括崩溃)。

而不是

int n, count = 0, i;
int ar[n];
...

int n, count = 0, i;

scanf("%d", &n);

int ar[n], ar2[601] = { 0 };

至少应该解决格式错误的数组,并且 ar2完全初始化为 0 。您可以摆脱您的memset ,无论如何,它只初始化了 600 个项目(而不是 601 个)。

关于计算除 0 以外的不同数字 (C) 在不同编译器中输出不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49414874/

相关文章:

c - 如何设计一个程序,使 GUI 和程序逻辑分离

c - 在C中反序列化一个字符串

c - rt linux中的用户程序如何访问或接收来自内核的数据?

c - 传递结构与将变量传递给 C 中的函数

数组的 C 编程

c - C 中的文件、访问指针、读取和写入文件

c - 当我在 Xcode 中使用命令行工具输入内容时,代码会在我第一次输入时忽略它。为什么会这样,有没有办法避免呢?

c - 如何在 C 中打印非 ASCII 字符

c - 回调如何工作和全局数据同步

iPhone Cocoa 混合模式数学基本错误