【问题标题】:Why does the output changes when i change the value of variables?为什么当我改变变量的值时输出会改变?
【发布时间】:2018-03-10 15:02:02
【问题描述】:

这是我的 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]&lt;arr[j] 无论如何都会为假,因此将跳过该步骤。 您可以自己运行程序并查看更改值和不更改值的输出。

【问题讨论】:

  • 可能是因为未定义的行为
  • 并行数组建议使用struct
  • 您是否尝试过使用调试器深入研究该区域以查看发生了什么?
  • 您应该从问题中删除 cpu 标签。
  • 为了便于阅读和理解:1) 遵循公理:每行只有一个语句,并且(最多)每个语句一个变量声明。 2) 单独的代码块 ( forifelsewhiledo...whileswitchcasedefault)通过一个空行。 3) 用 2 或 3 个空行分隔函数(保持一致)

标签: c cpu scheduling


【解决方案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

您可能将charstring 混淆了,char 类型只是一个整数类型,而 string is/可以由char类型的值组成。

所以回答你问题的标题:

  • 代码肯定会调用未定义的行为,这种行为是不确定的,并且取决于您实际上无法控制的事物,因此更改某些值可能会更改输出。

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

嗯,

  1. 检查 scanf() 是否确实初始化了 n 并且/明确地将 n 初始化为一个你知道不会产生的值感觉像-1,在scanf() 之后检查您的值是否符合要求,即它不会导致缓冲区溢出并且它是由用户输入的。

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

【讨论】:

  • 如果不使用 char 数组(带有 NUL 终止符),您将无法在 C 中做很多事情所以建议在需要时寻求帮助。
【解决方案2】:

据我说,当我改变 j=1 时输出不应该改变。作为 条件 arr[i]

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

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

【讨论】:

    猜你喜欢
    • 2015-01-07
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 2022-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    相关资源
    最近更新 更多