2014-02-27 84 views
0

這是一個使用C製作的FCFC模擬器程序。我得到這個錯誤「Run-Time Check Failure#2 - Stack around the variable' d'被損壞了。「在完成輸入每個過程的所有輸入之後。 我在做什麼錯?運行時檢查失敗#2 - 圍繞變量'd'的堆棧已損壞

void getdata() 
{ 
    char d; 
    printf("Enter the number of process: "); 
    scanf("%d",&n); 

    printf("\nDo you need to enter the arrival time of process [Y/N]: "); 
    scanf("%s",&d); 
    printf("\n"); 

    for(int i=0; i<n; i++) 
    { 
     printf("*******************************************\n"); 
     printf("Enter the %d process burst time: ",i+1); 
     scanf("%d",&b[i]); 
     if(d=='y' || d=='Y') 
     { 
       printf("Enter the %d process arrival time: ",i+1); 
       scanf("%d",&a[i]); 
     } 
     else 
     { 
       a[i]=0; 
     } 
    } 
} 
+1

將其重新標記爲c,不是C++。 – hmjd

回答

4

這是一個錯誤:

char d; 
scanf("%s",&d); 

scanf("%s"),直到它找到的空白,然後附加一個空終止將寫信給它的參數。 d只有一個字符的空間,意思是如果至少有一個字符,那麼scanf()將寫入內存,它不應該導致某種形式的腐敗。使用數組並限制可讀取的字符數以防止緩衝區溢出。例如:

char d[128]; 
scanf("%127s", d); /* One less than size to leave room for null terminator. */ 

檢查的scanf()返回值(和返回指示失敗或成功的值的所有功能),以確保d實際上已被填充。


爲了避免重複(基本上)的sizeofscanf()格式說明陣列d,這是一種維護開銷和容易出錯,構建格式說明用於讀取d代替:

char d[128]; 
char d_format[32]; 
if (snprintf(d_format, sizeof(d_format), "%%%lus", sizeof(d) - 1) > 0) 
{ 
    if (1 == scanf(d_format, d)) 
    { 
    } 
} 

使用此方法,如果sizeof()陣列d發生更改,則讀取d的格式說明符將自動更新爲正確的寬度(請參閱demo @http://ideone.com/9IsmgH)。

相關問題