2016-09-17 125 views
0

我想寫一個簡單的C程序,它接受一個數字的輸入並返回數字的總和以及數字的反向。該程序目前不完整,因爲我在測試時遇到了分段錯誤錯誤。C - 分段錯誤(核心轉儲)

下面是代碼:

#include <stdio.h> 
#include <string.h> 

int sumdigits(int); 

int main() { 
    int num;    // The number to be read 
    int reverse;   // The reverse of the input 
    int sum;    // The sum of the digits 


    printf("Enter a number: "); 
    scanf("%d", &num); 
    sum = sumdigits(num); 
    printf("Sum of digits: %s", sum); 
} 

int sumdigits(int number) { 
    int sum = 0; 
    int temp = number; 
    while (temp != 0) { 
     sum += (temp % 10); 
     temp /= 10; 
    } 
    return sum; 
} 

通過使用一些打印語句,我發現,錯誤很可能在這些線路的某處發生:

printf("Enter a number: "); 
scanf("%d", &num); 

我能夠進入數字,但在此之後,我收到一條消息,說Segmentation Fault(核心轉儲)並退出程序。使用sudo權限運行該程序只會提供分段錯誤,而不會消息的「核心轉儲」部分。

由指令提供

調試信息,隨後here似乎表明printf語句是什麼原因造成的錯誤,因爲這是輸出:

(gdb) run 
Starting program: /home/sschmalz/Documents/Classes/CIS308/proj1/debug 
Enter a number: 123 

Program received signal SIGSEGV, Segmentation fault. 
0x00007ffff7a62fb4 in vfprintf() from /lib64/libc.so.6 

不過,我不知道該怎麼做這信息,所以我無法解決錯誤。

我已經問過我的教授在實驗室中遇到同樣的錯誤,他無法找到解決方案。這現在發生在兩個不同的實驗室,再加上這個項目,這讓我覺得它可能是我的電腦設置而不是代碼本身。

我正在編寫使用vim和使用gcc編譯的程序。在大多數情況下,我不重命名編譯器的輸出,所以我使用「./a.out」來運行它。我使用Fedora 24來編寫和運行這些程序。如果需要關於我的系統的其他信息,請告訴我。

+1

傳遞一個'int'到'的printf()'用'%s'轉換不確定的行爲。 – EOF

+0

我的計算機上的編譯器出於某種原因沒有收到字符串格式錯誤。我把這個文件上傳到我大學的Linux服務器上,並在那裏編譯,這給了我例外和修復。謝謝大家的幫助,對於這樣一個小問題,我覺得自己像個白癡。 –

回答

0

變化

printf("Sum of digits: %s", sum); 

printf("Sum of digits: %d", sum); 

%s是不是整數的字符串(%d是有符號整數)。

http://www.cplusplus.com/reference/cstdio/printf/

+0

謝謝你指出這一點。出於某種原因,我的計算機上的編譯器沒有看到這一點,但是當我將其上傳到我大學的Linux服務器並編譯時,它引發了一個異常。 –

+0

@SamSchmalzried這不是一般會被捕獲的東西,因爲所有的編譯器都需要知道或關心的是'printf()'接受一個任意的字符串和一組可變參數(因此必然是任意的),兩者都是你提供了。檢查你提供的參數是否合理組合需要大量的雜技 - 並且可能需要運行時檢測變量參數idk - 大多數編譯器不會浪費時間去做,除非你明確告訴它們。否則,他們只是假設你的論點是有道理的。 –

0

您已在printf()功能使用不正確的格式說明符,其修改爲:

printf("Sum of digits: %d", sum); 

,它會正常工作(%d代表十進制(數字)和%s代表字符串)。

0

我跑你的代碼和它的作品,但你必須改變printf("Sum of digits: %s", sum);要麼printf("Sum of digits: %i", sum);printf("Sum of digits: %d", sum);

有使用%d%i中沒有差異printf(),因爲:

  1. 轉換說明符及其含義如下:d,i - int參數轉換在樣式[ - ] dddd中標記爲十進制。精度爲 指定要顯示的最小位數;如果要轉換的值爲 可用較少的數字表示,則用前導零擴展爲 。默認精度爲1. 將精度爲零的零值轉換爲無字符。 來源:C99標準http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf

然而,在使用scanf()%d%i因爲前者被存儲爲一個十進制整數,後者爲一個整數的差。來源:https://cs50.harvard.edu/resources/cppreference.com/stdio/scanf.html

我跑了代碼工作:

#include <stdio.h> 
#include <string.h> 

int sumdigits(int); 

int main() { 
    int num;    // The number to be read 
    int reverse;   // The reverse of the input 
    int sum;    // The sum of the digits 


    printf("Enter a number: "); 
    scanf("%i", &num); 
    sum = sumdigits(num); 
    printf("Sum of digits: %i", sum); 
} 

int sumdigits(int number) { 
    int sum = 0; 
    int temp = number; 
    while (temp != 0) { 
     sum += (temp % 10); 
     temp /= 10; 
    } 
    return sum; 
}