2016-08-30 74 views
0
#include <stdio.h> 
#include <string.h> 

main() 
{ 
    int h, m; 
    char designator[] = ""; 

    printf("Please enter the hours: "); 
    scanf("%d", &h); 
    if (h < 0 || h > 23) 
    { 
     printf("Please enter a proper time!"); 
    } 

    else 
    { 
     printf("Please enter the minutes: "); 
     scanf("%d", &m); 
     if (m > 59 || m < 0) 
     { 
      printf("Please enter a proper time!"); 
     } 

     else if (h == 0 && m == 0) 
     { 
      strcpy(designator, "midnight"); 
     } 
     else if (h == 12 && m == 0) 
     { 
      strcpy(designator, "noon"); 
     } 
     else if (h == 0) 
     { 
      strcpy(designator, "am"); 
      h = h + 12; 
     } 
     else if (h < 12) 
     { 
      strcpy(designator, "am"); 
     } 
     else if (h > 12) 
     { 
      strcpy(designator, "pm"); 
      h = h - 12; 
     } 
     printf("The time is: %d:%d %s", h, m, designator); 
    } 
} 

你好!當我運行這段代碼時,我得到一個非常意外的輸出。變量(特別是m)不應該改變。它們被用作scanf()的輸入,但我無意改變它們。我假設變量有問題或者與IF的,但我真的不知道是什麼問題,我的代碼:/變量的內容意外改變?

這是出現在命令行:

請輸入時間: 23
請輸入分鐘:15
的時間是:11:109時

我試圖找出其中「109」是來自,但我不知道任何責任。我對C很陌生,所以可能有些東西對我來說還不清楚,但我很樂意去了解它們。

回答

3

如果你做sizeof designator你會看到它的大小隻有一個字節。它的內容將是單個字符'\0'(字符串終結符)。這是因爲你初始化它的方式。

如果您創建的數組沒有顯式大小,編譯器會從您用來初始化數組的任何數據中推導出大小。既然你用一個空字符串初始化它,一個空字符串就是它將包含的內容,這就是它的大小。

因此,您將寫出數組的界限,並且這將導致未定義的行爲

您需要顯式設置數組的大小,該數組的大小足以包含要複製到其中的最大字符串。

E.g.

char designator[128] = ""; 
+0

是否有任何理由爲什麼指定變量影響其他變量?還是僅僅是你在那裏提到的未定義的行爲? – NugNugs

+0

@NugNugs基本原因是所有的局部變量都存儲在CPU核心堆棧中,並佔用編譯器決定的足夠空間。這意味着當你寫出數組的界限時,你可能會覆蓋存儲其他變量的棧的內存。 –

0

數字變量的值可能會改變,因爲你是複製字節沒有足夠空間的位置(designator),可覆蓋它們。