2017-04-08 101 views
2

我想創建一個簡單的「日記」,在那裏你添加工人,然後寫他們工作了多少小時。但每次我看到switch語句時,都會遇到分段錯誤。我不知道是什麼原因造成的,我的知識還沒有達到我自己能夠找到的水平。 代碼:我不知道什麼是導致分段錯誤

include <stdio.h> 
include <stdlib.h> 
include <string.h> 

int vybera(int pocet){ 
    int vyber; 
    int i; 
    printf("\nKtery zamestnanec?\n"); 
    for(i = 0; i < pocet; i++){ 
     printf("%d\n", i + 1); 
    } 
    scanf("%d", vyber); 
    return vyber; 
} 

int main(int argc, char** argv) { 
    int worker; 
    int pocet; 
    int i; 
    int vyber; 
    int pomoc; 
    int odprac = 0; 
    printf("Kolik zamestnancu chcete pridat: "); 
    scanf("%d%*c", &pocet); 
    char workforce[pocet][100]; 
    printf("Zadejte %d jmen: \n", pocet); 
    for(i = 0; i < pocet; i++){ 
     gets(workforce[i]); 
    } 
    for(i = 0; i < pocet; i++){ 
     printf("%s\n", workforce[i]); 
    } 
    vyber = vybera(pocet); 
    switch(vyber){ 
     case 1: 
      worker = vyber - 1; 
      printf("Vybrali jste %s.\n", workforce[worker]); 
      printf("Pocet odprac. hodin: "); 
      scanf("%d", pomoc); 
      odprac += pomoc; 
      strcat(workforce[worker], (", %c", odprac + '0')); 
      break; 
     case 2: 
      worker = vyber - 1; 
      printf("Vybrali jste %s.\n", workforce[worker]); 
      printf("Pocet odprac. hodin: "); 
      scanf("%d", pomoc); 
      odprac += pomoc; 
      strcat(workforce[worker], (", %c", odprac + '0')); 
      break; 
     case 3: 
      worker = vyber - 1; 
      printf("Vybrali jste %s.\n", workforce[worker]); 
      printf("Pocet odprac. hodin: "); 
      scanf("%d", pomoc); 
      odprac += pomoc; 
      strcat(workforce[worker], (", %c", odprac + '0')); 
      break; 
     case 4: 
      worker = vyber - 1; 
      printf("Vybrali jste %s.\n", workforce[worker]); 
      printf("Pocet odprac. hodin: "); 
      scanf("%d", pomoc); 
      odprac += pomoc; 
      strcat(workforce[worker], (", %c", odprac + '0')); 
      break; 
     case 5: 
      worker = vyber - 1; 
      printf("Vybrali jste %s.\n", workforce[worker]); 
      printf("Pocet odprac. hodin: "); 
      scanf("%d", pomoc); 
      odprac += pomoc; 
      strcat(workforce[worker], (", %c", odprac + '0')); 
      break; 
     default: 
      printf("Spatny vyber.\n"); 
    } 
    for(i = 0; i < pocet; i++){ 
     printf("%s\n", workforce[i]); 
    } 
    return (EXIT_SUCCESS); 
} 

我真的在我束手無策,並需要每幫助我能。雖然關於segementation故障主題有很多問題,但我發佈這個的原因是它們都沒有使用我的代碼。我感謝您的任何幫助和所有的耐心。 編輯:我來自捷克,因此爲什麼我的大部分變量和我所有的printf輸出都在捷克。只是FYI。

回答

2

change:scanf(「%d」,vyber);到scanf(「%d」,& vyber)與pomoc一樣;
說明:因爲vyber變量是int,所以您需要明確地將地址值傳遞給「&」和號,這與字符串(隱式傳遞其地址)不同。分段錯誤表示您嘗試訪問不屬於您的內存。在這種情況下,vyber。

2
scanf("%d", pomoc); 

這是scanf()函數的不正確語法。它應該是:

scanf("%d", &pomoc); 

同樣的錯誤在輸入語句複製爲vyber

scanf("%d", &vyber) 

這是因爲您試圖訪問一個超出範圍的內存位置與scanf()功能。由於您沒有引用變量vyberpomoc,因此編譯器嘗試訪問內存點的地址等於存儲在vyberpomoc中的變量,而不是這些變量的內存位置。這會導致未定義的行爲,這就是爲什麼您會遇到seg-fault。

2

你已經被告知問題出在哪裏,但讓我簡單地提一下如何自己找到(下一個)問題。基本上,有(至少)三種方式:

  1. 使用調試器通過線運行你的程序行,直至崩潰。調試器還可以讓您停止程序並檢查任何變量的值,以查看代碼實際正在執行的操作。你沒有告訴我們你使用的是什麼操作系統,編譯器和IDE(如果有的話),所以我不能推薦任何特定的調試器(並且在任何情況下,這對於SO來說都不是真正的主題),但幾乎可以肯定的是一個可用於系統的調試器,不管它是什麼。學習如何使用調試器需要一點努力,但它確實是值得的


  • 如果您不能或不想使用調試器由於某種原因,你可以通過添加printf()聲明做「窮人的調試」到您的代碼中,顯示發生了什麼。這樣,您可以看到程序在崩潰之前得到了多少程度,還可以打印出變量的值以更好地瞭解發生的情況。

    我會推薦打印到標準錯誤流(使用fprintf(stderr, "...")),因爲它不會干擾程序的正常輸出,並且每次打印時都會自動刷新錯誤流,因此,如果程序崩潰,沒有緩衝輸出的風險。

    一個有用的技巧是前綴,調試打印語句與if (DEBUG),像這樣:

    if (DEBUG) fprintf(stderr, "This is an example of debugging output.\n"); 
    

    然後,在你的程序的頂部,包括像一條線:

    #define DEBUG 1 
    

    這樣,您可以通過將1更改爲0來輕鬆關閉調試輸出。 (也有更先進的方法來改變定義在編譯時,或配置您的IDE它依賴於構建目標改變,但是這就是答案的範圍之內。)


    1. 最後,你可以做「二分調試」。基本上,製作一份你的程序(或者更好的做法是將它提交到你的版本控制系統中),並開始刪除部分代碼,直到問題停止發生。此時,您會知道問題與您移除的最後一段代碼中的某些內容有關。然後,您可以撤消最近的更改並刪除其他內容,並繼續執行此操作,直到您將程序縮減到simplest possible example,但仍然顯示問題。

      在這一點上,應該很容易看出問題所在,因爲您不再有任何不相關的代碼讓您分心。或者,如果沒有的話,至少你有一小段代碼可以清楚地表明問題,並且你可以在Stack Overflow上發佈以尋求幫助。 :)

    相關問題