为什么在更改变量值时输出会发生变化?

时间:2018-03-10 15:02:02

标签: c cpu scheduling

这是我的FCFS CPU调度算法代码。当我替换j = 1时,输出会改变。

#include<stdio.h>
#include<string.h>
#include<conio.h>
main()
{
    char pn[10][10],t[10];
    int arr[10],bur[10],star[10],finish[10],tat[10],wt[10],i,j,n,temp;
    int totwt=0,tottat=0;
//clrscr();
    printf("Enter the number of processes:");
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        printf("Enter the ProcessName, Arrival Time& Burst Time:");
        scanf("%s%d%d",&pn[i],&arr[i],&bur[i]);
    }
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            if(arr[i]<arr[j])
            {
                temp=arr[i];
                arr[i]=arr[j];
                arr[j]=temp;
                temp=bur[i];
                bur[i]=bur[j];
                bur[j]=temp;
                strcpy(t,pn[i]);
                strcpy(pn[i],pn[j]);
                strcpy(pn[j],t);
            }

        }
    }

    for(i=0; i<n; i++)
    {
        if(i==0)
            star[i]=arr[i];
        else
            star[i]=finish[i-1];
        wt[i]=star[i]-arr[i];
        finish[i]=star[i]+bur[i];
        tat[i]=finish[i]-arr[i];
    }
    printf("\nPName Arrtime Burtime WaitTime Start TAT Finish");
    for(i=0; i<n; i++)
    {
        printf("\n%s\t%3d\t%3d\t%3d\t%3d\t%6d\t%6d",pn[i],arr[i],bur[i],wt[i],star[i],tat[i],finish[i]);
        totwt+=wt[i];
        tottat+=tat[i];
    }
    printf("\nAverage Waiting time:%f",(float)totwt/n);
    printf("\nAverage Turn Around Time:%f",(float)tottat/n);
    getch();
    return 0;
}

问题专栏:

for(j=0; j<n; j++)

据我所知,当我改变j = 1时,输出不应该改变。因为条件arr[i]<arr[j]无论如何都将是假的,并且将跳过该步骤。 您可以自己运行程序并查看带有和不带更改值的输出。

2 个答案:

答案 0 :(得分:1)

第一个也是最严重的问题是

scanf("%s%d%d",&pn[i],&arr[i],&bur[i]);

请注意,您在每次调用时都会将指针传递给下一个字符,此代码也是不确定的,因为n的值根本不受限制,并且值为n这将导致缓冲区溢出,但您的代码不会检查它。

此外,自

scanf("%s%d%d",&pn[i],&arr[i],&bur[i]);

对于pn[9]读取和存储的字符数没有限制,那么您肯定会确保溢出pn

你可能想要不同的东西,例如

char pn[10][10];

scanf("%s%d%d", pn[i], &arr[i], &bur[i]);
//             ^ note that you don't need the & for this

您可能已将char字符串混淆,char类型只是一个整数类型而字符串 / 可以char类型的值组成。

所以回答你问题的标题:

  • 代码肯定会调用未定义的行为,这种行为是非确定性的,取决于你无法实际控制的事情,因此更改某些值可能会改变输出。

现在您可能会问那么我该如何解决这个问题?

那么,

  1. 检查scanf()是否确实初始化n / n显式初始化为您的值知道像-1那样没有意义,在scanf()之后检查你的值是否符合要求,即它不会导致缓冲区溢出并且是由用户输入的。

  2. 为字符串使用更合适的存储空间,并了解真正的字符串,以便您可以正确操作它们。这是编程中的一个难题,所以你可以进行所有的研究,除非你觉得你已经掌握了它,否则不要试图在中使用字符串。

答案 1 :(得分:-1)

  

据我所知,当我改变j = 1时,输出不应该改变。如   条件arr [i]&lt;无论如何,arr [j]将会是假的,那一步   将被跳过。

没有。当i = j时,该条件仅保证为假。是的,在外部循环的第一次迭代中,i = j = 0.但是在外部循环的所有其他迭代中,无论j是从0还是1开始,它都会有所不同。例如,在外部循环的第二次迭代中,i = 1.如果j = 0,则条件可能为真。另一方面,从j = 1开始跳过j = 0的迭代,可能产生不同的结果。这适用于外循环的所有其他迭代。

您面临的问题与未定义的行为无关。