2011-11-14 74 views
0

我正在學習使用switch語句並使用rand()和srand()函數,但當我嘗試運行此代碼時,出現了分段錯誤,我從本書中獲得了我正在從中學習C 。什麼可能導致這種情況發生?爲什麼運行此代碼時出現分段錯誤?

#include <stdio.h> 

int main(void) 
{ 

int iRandomNum = 0; 
srand(time()); 

iRandomNum = (rand() % 4) + 1; 

printf("\nFortune Cookie - Chapter 3\n"); 

    switch (iRandomNum) { 

    case 1: 
     printf("\nYou will meet a new friend today.\n"); 
     break; 
    case 2: 
     printf("\nYou will enjoy a long and happy life.\n"); 
     break; 
    case 3: 
     printf("\nOpportunity knocks softly. Can you hear it?\n"); 
     break; 
    case 4: 
    printf("\nYou'll be financially rewarded for your good deeds.\n"); 
     break; 

    } //end switch 

printf("\nLucky lotto numbers: "); 
printf("%d ", (rand() % 49) + 1); 
printf("%d ", (rand() % 49) + 1); 
printf("%d ", (rand() % 49) + 1); 
printf("%d ", (rand() % 49) + 1); 
printf("%d ", (rand() % 49) + 1); 
printf("%d\n", (rand() % 49) + 1); 

} //end main function 
+0

在seg故障之前控制檯上是否出現了任何問題?基本上,你有沒有得到任何printf語句顯示? –

+1

確保你[編譯調試標誌](http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html)(通常是'-g'),然後使用['gdb']運行你的程序。 (http://www.gnu.org/s/gdb/)來找出究竟是哪一行seg故障發生。 –

+0

@adam在分段錯誤之前沒有任何東西出現,我編譯時沒有錯誤,然後當我運行它時,它說分段錯誤。 – nastyn8

回答

2

你打電話time()沒有參數。 time()函數有一個參數,它不是可選的。

添加

#include <time.h> 

到源文件的頂部,並更改srand()調用

srand(time(NULL)); 

編輯:

您還需要添加

#include <stdlib.h> 

得到srand()rand()的聲明。

編輯2:

你可以經常(貌似)逃脫調用一個函數沒有#include荷蘭國際集團在它的聲明的標題。

在C90中,如果你調用一個函數,沒有可見的聲明,編譯器暗中爲其創建一個聲明,假設該函數返回int,並採取在調用中給出的參數。 srand()rand()確實返回int結果,因此可以調用它們。但time()採用類型time_t*的參數,並返回time_t類型的結果;如果你「幸運」,沒有聲明的電話可能會工作,否則它可能會炸燬你的臉。

1999年ISO C標準(C99)改變了規則,所以調用一個沒有可見聲明的函數是違反約束的,需要編譯器的診斷。

即使在C90模式下,如果您給出正確的選項,也可以說服大多數編譯器警告未聲明的函數。底線:如果你要調用一個庫函數,請閱讀它的文檔(手冊頁,不管),併爲聲明它的頭添加一個#include。而不要指望編譯器提醒你,如果你忘記這樣做。

+0

你是正確的,這是我沒有的#include 現在它運行良好 – nastyn8

+0

感謝基思,跆拳道是不對的這本書,爲什麼沒有顯示我的正確方法,它在2008年被做,這就是所謂的「 C爲絕對初學者「。 – nastyn8

+0

但唯一的是我沒有的#include 使用,它工作得很好,是正常的嗎? – nastyn8

5

這是因爲time()需要一個參數,東西,如果你打開所有的警告,如用gcc -Wall -Wextra ...編譯器會告訴。

不包括time.h(意味着time()得到一個默認的原型),並調用它沒有一種說法是你的具體問題相結合。

的使用higehr警告級別時,發現了問題的完整列表是:

  • time()srand()rand()有沒有原型,你需要#includestdlib.htime.h
  • time()需要參數,如srand (time (0))
  • 您應該返回從main東西(不是絕對必要的非常語言的近期反覆,但仍然很好的做法)。

以下罰款變化工作:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main (void) { 
    int iRandomNum = 0; 
    srand (time (0)); 

    iRandomNum = (rand() % 4) + 1; 

    printf("\nFortune Cookie - Chapter 3\n"); 

    switch (iRandomNum) { 
     case 1: 
      printf("\nYou will meet a new friend today.\n"); 
      break; 
     case 2: 
      printf("\nYou will enjoy a long and happy life.\n"); 
      break; 
     case 3: 
      printf("\nOpportunity knocks softly. Can you hear it?\n"); 
      break; 
     case 4: 
      printf("\nYou'll be financially rewarded for your good deeds.\n"); 
      break; 
    } //end switch 

    printf("\nLucky lotto numbers: "); 
    printf("%d ", (rand() % 49) + 1); 
    printf("%d ", (rand() % 49) + 1); 
    printf("%d ", (rand() % 49) + 1); 
    printf("%d ", (rand() % 49) + 1); 
    printf("%d ", (rand() % 49) + 1); 
    printf("%d\n", (rand() % 49) + 1); 

    return 0; 
} 
+0

我沒有使用,但它仍然工作 – nastyn8

+1

@ nastyn8,它可能仍然有效,但您不會有'rand'或'srand'的原型。您應該_always_包含您使用的函數的相關頭文件。 – paxdiablo

3

我以前gdb調試代碼和你的段錯誤發生在這一行:

srand(time()); 

您正在使用time()不正確。你需要傳遞,將舉行所產生的時間,但NULL會導致功能return時間的參數:

srand(time(NULL)); 

此外,從main()功能一定要總是return做。

此代碼工作正常:

gcc -g -Wall -Wextra test.c -o test 

和:

#include <stdlib.h> 
#include <stdio.h> 
#include <time.h> 

int main(void) 
{ 

int iRandomNum = 0; 
srand(time(NULL)); 

iRandomNum = (rand() % 4) + 1; 

printf("\nFortune Cookie - Chapter 3\n"); 

    switch (iRandomNum) { 

    case 1: 
     printf("\nYou will meet a new friend today.\n"); 
     break; 
    case 2: 
     printf("\nYou will enjoy a long and happy life.\n"); 
     break; 
    case 3: 
     printf("\nOpportunity knocks softly. Can you hear it?\n"); 
     break; 
    case 4: 
    printf("\nYou'll be financially rewarded for your good deeds.\n"); 
     break; 

    } //end switch 

printf("\nLucky lotto numbers: "); 
printf("%d ", (rand() % 49) + 1); 
printf("%d ", (rand() % 49) + 1); 
printf("%d ", (rand() % 49) + 1); 
printf("%d ", (rand() % 49) + 1); 
printf("%d ", (rand() % 49) + 1); 
printf("%d\n", (rand() % 49) + 1); 

return 0; 
} //end main function 

萬一你感興趣,我如何調試你的代碼,我有調試符號和每一個編譯器警告可能編譯它我開始gdb

gdb ./test 
(gdb) run 
Program received signal SIGSEGV, Segmentation fault. 
0x00007ffff7ffba2c in time() 
(gdb) quit 
+0

我做了你說的,我仍然得到seg錯誤 – nastyn8

+1

你還是需要添加'#include ',所以'time()'函數的聲明是可見的。 ''#include 'srand()'和'rand()'。 –

+0

你確定?起初,我包括它。但我省略了它,代碼仍然編譯。我會重新包含它以保證衡量。 – Blender

相關問題