【问题标题】:C Program will compile and run in Linux but not WindowsC 程序将在 Linux 而非 Windows 中编译和运行
【发布时间】:2017-02-20 21:26:23
【问题描述】:

我正在为一门编程课做作业,但我遇到了一个程序问题。目标是获取一组用户定义的值,将它们存储在一个数组中,然后找到最接近的一对数字(差异最小的数字)。这些数字不必有连续的索引。此外,教授在作业中定义了 50 的数组大小。

我遇到的问题是该程序将在 Linux(Ubuntu 14.xx)和 Windows 10 中编译,但是,当我在 Linux 中运行结果时,它工作正常,但在 Windows 中它什么也不输出。

这是我第一次遇到这个问题,据我所知,我没有使用任何系统特定的命令。提供的任何帮助将不胜感激。

代码:

#include <stdio.h>

int main()
{
    int i, j, a, b, temp, mindiff, count;
    int numarray[50];

    count = 0;

    for (i = 0; i < 50; i++)
    {
        scanf("%d", &numarray[i]);
        count++;
        if (numarray[i] == -1)
        {
            numarray[i] = 0;
            count--;
            break;
        }
    }
    mindiff = 100;
    for (i = 0; i < count; i++)
    {
        for (j = 0; j < count; j++)
        {
            a = numarray[i];
            b = numarray[j];
            if (a != b)
                if (a > b)
                    temp = a - b;
                else    
                    temp = b - a;

            if (temp < mindiff)
                mindiff = temp;
        }
    }

    for (i = 0; i < count; i++)
    {
        for (j = 0; j < count; j++)
        {
            a = numarray[i];
            b = numarray[j];
            if (a != b) 
            {
                if (a > b && (a - b) == mindiff)
                {
                    printf("Closest pair: %d and %d, Difference: %d\n", a, b, mindiff);
                    return 0;
                }
            }
        }
    }

    return 0;
}

【问题讨论】:

  • 在 Windows 中,你究竟是如何编译和运行这个程序的?你用什么样的命令行终端来运行它?您提供什么输入,以及如何输入?
  • 试试if (a != b){ if (a &gt; b) temp = a - b; else temp = b - a; if (temp &lt; mindiff) mindiff = temp; }
  • 您应该检查scanf() 是否有错误,main 至少应为int main(void){}
  • 在 Linux 上,使用 gcc -Wall test.c -o test.exe 编译。它会提醒您注意三个潜在问题。你甚至可以使用-Wall -Wextra

标签: c linux windows ubuntu


【解决方案1】:

至少有两个主要问题:

  • 你的代码有未定义的行为,因为你使用了temp,即使它没有被设置(你应该在if (a != b)之后开始一个块)。 未定义的行为意味着任何事情都可能发生,包括在 Linux 上的明显成功和在 Windows 上的失败。

  • 您将mindiff 初始化为100。如果所有数字彼此相距较远,mindiff 将不会更改,第二个循环也不会打印任何内容。

这是一个更简单的版本:

#include <stdio.h>

int main(void) {
    int count, i, j, mina, minb, mindiff;
    int numarray[50];

    for (count = 0; count < 50; count++) {
        if (scanf("%d", &numarray[count]) != 1 || numarray[count] == -1)
            break;
    }
    mindiff = mina = minb = 0;
    for (i = 0; i < count; i++) {
        for (j = 0; j < count; j++) {
            int a = numarray[i];
            int b = numarray[j];
            if (a > b) {
                int diff = a - b;
                if (mindiff == 0 || mindiff > diff) {
                    mindiff = diff;
                    mina = a;
                    minb = b;
                }
            }
        }
    }
    if (mindiff == 0) {
        if (count == 0) {
            printf("No numbers input\n");
        } else {
            printf("The numbers are all identical\n");
        }
    } else {
        printf("Closest pair: %d and %d, Difference: %d\n",
               mina, minb, mindiff);
    }
    return 0;
}

【讨论】:

  • 谢谢,temp变量被设置为0,这意味着temp总是
  • @Hunter:从技术上讲,temp 未初始化,它碰巧在您的机器上是 0,但它可以有任何值,包括在每次运行以及可能在某些体系结构上使程序崩溃的值...将if (temp &lt; mindiff) mindiff = temp; 包含在if (a != b) 测试命令的块中可以解决此问题,但a[0] 的特殊情况是最大的,并且是所有情况中最大的。相同的值也需要注意。
【解决方案2】:

您有以下问题:
注意:temp被认为是main函数下的堆栈变量,由于你没有初始化它,它变成了垃圾(例如一个很大的负数):

int i, j, a, b, temp, mindiff, count;

那么如果temp是一个很大的负数,mindiff = mindiff的垃圾值,

        if (temp < mindiff)
            mindiff = temp;

并且下面的 if 语句总是错误的。 if (a > b && (a - b) == mindiff)

什么都没有打印出来。

【讨论】:

  • @EOF 对不起,我修正了我的错误。我的意思是临时而不是介意
  • 嘿,戴夫,我没有对你投反对票。不知道是谁这样做或为什么他们会这样做。你的答案是正确的。
  • @DaveS 感谢您的回复。您的回答是正确的,有助于确定问题。在 Windows 中,我的编译器(或运行时不确定哪个,还不确定它是如何工作的)设置 temp = 0,这意味着 temp 总是
  • @Hunter - 很高兴能帮上忙。不幸的是,我的帖子得了-1,这太糟糕了。
  • 我确实赞成你的回答,但是,作为一个新用户,我没有足够的声誉让它出现在公众面前。我现在这样做并再次这样做以表达我的感激之情。很抱歉有人对您的回答投了反对票。我想有些人只是想看着世界燃烧
猜你喜欢
  • 1970-01-01
  • 2021-10-05
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 2022-10-14
  • 1970-01-01
相关资源
最近更新 更多