2016-09-17 12 views
0

Ich versuche, ein einfaches C-Programm zu schreiben, das die Eingabe einer Zahl übernimmt und die Summe der Ziffern sowie die Umkehrung der Zahl zurückgibt. Das Programm ist zur Zeit unvollständig, da ich beim Testen immer Fehler mit Segmentationsfehlern erhalte.C - Segmentierungsfehler (Core Dumped)

Hier ist der Code:

#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; 
} 

Durch einige Druck-Anweisungen, ich habe entdeckt, dass der Fehler höchstwahrscheinlich irgendwo in dieser Richtung auftritt:

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

ich in der Lage bin zu betreten Nummer, aber sofort danach bekomme ich eine Meldung, Segmentierung Fehler (Core Dumped) und das Programm beendet. Wenn Sie das Programm mit sudo-Rechten ausführen, wird nur der Segmentierungsfehler ohne den "core dumped" -Teil der Nachricht angezeigt.

Debug-Info von Anweisungen zu befolgen here, dass die printf-Anweisung ist, um anzuzeigen scheint, was den Fehler verursacht, da dies die Ausgabe lautet:

(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 

aber ich weiß nicht, was damit zu tun Informationen, damit ich den Fehler nicht beheben kann.

Ich habe meinen Professor um Hilfe mit dem gleichen Fehler im Labor gebeten, und er konnte keine Lösung finden. Dies ist jetzt in zwei verschiedenen Labors passiert, und außerdem bei diesem Projekt, das mich glauben lässt, dass es etwas mit dem Setup meines Computers und nicht mit dem Code selbst sein könnte.

Ich schreibe das Programm mit vim und kompilieren mit gcc. In den meisten Fällen benenne ich die Ausgabe des Compilers nicht um, also benutze ich "./a.out" Ich benutze Fedora 24 um diese Programme zu schreiben und auszuführen. Wenn weitere Informationen zu meinem System benötigt werden, lassen Sie es mich wissen.

+1

undefiniertes Verhalten für das Bestehen eines 'int' zu' printf() 'mit'% s' Umwandlung. – EOF

+0

Mein Compiler auf meinem Computer hat den Zeichenfolgenformatierungsfehler aus irgendeinem Grund nicht abgefangen. Ich habe die Datei auf den Linux-Server meiner Universität hochgeladen und dort kompiliert, was mir die Ausnahme und das Update gab. Danke euch allen für eure Hilfe, ich fühle mich für so ein kleines Problem wie ein Idiot. –

Antwort

0

ändern

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

zu

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

%s ist für Strings nicht für ganze Zahlen (%d für signierte ganze Zahlen).

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

+0

Vielen Dank, dass Sie darauf hingewiesen haben. Aus irgendeinem Grund hat der Compiler auf meinem Computer dies nicht bemerkt, aber als ich ihn auf den Linux-Server meiner Universität hochgeladen und kompiliert habe, wurde eine Ausnahme ausgelöst. –

+0

@SamSchmalzried Das ist nichts, das allgemein erfasst wird, da jeder Compiler wissen oder sich darum kümmern muss, dass 'printf()' eine beliebige Zeichenfolge und eine Menge variadischer (und daher notwendigerweise beliebiger) Argumente verwendet du hast zur Verfügung gestellt. Die Überprüfung, ob die Argumente, die Sie zur Verfügung gestellt haben, in Kombination sinnvoll sind, würde eine Menge Akrobatik - und möglicherweise Laufzeit-Instrumentierung für die variadischen Argumente, idk - erfordern, die die meisten Compiler nicht verschwenden werden, es sei denn, Sie sagen es ihnen explizit. Andernfalls nehmen sie einfach an, dass Ihre Argumente Sinn ergeben. –

0

Sie haben eine falsche Formatangabe in den printf() Funktionen verwendet, ändern Sie es an:

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

und es wird korrekt funktionieren (%d steht für dezimal (Zahlen) und %s steht für Streicher).

0

ich Ihren Code lief und es funktioniert, aber Sie müssen die printf("Sum of digits: %s", sum); ändern, um entweder printf("Sum of digits: %i", sum); oder printf("Sum of digits: %d", sum);

Es gibt keinen Unterschied in ist mit %d oder %i in printf() weil:

  1. Die Conversion-Spezifizierer und ihre Bedeutungen sind: d, i - das Argument int ist konverg ted zu signed dezimal im Stil [-] dddd. Die Genauigkeit gibt die Mindestanzahl der Ziffern an, die angezeigt werden sollen. Wenn der zu konvertierende Wert in weniger Ziffern dargestellt werden kann, wird er mit führenden Nullen erweitert. Die Standardgenauigkeit ist 1. Das Ergebnis von Umwandlung eines Nullwerts mit einer Genauigkeit von Null ist keine Zeichen. Quelle: C99-Standards http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf

Allerdings gibt es einen Unterschied, wenn %d oder %i in scanf() verwenden, da die erstere als Dezimalzahl und letztere als Integer gespeichert. Quelle: https://cs50.harvard.edu/resources/cppreference.com/stdio/scanf.html

Der Code, den ich lief das funktioniert:

#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; 
} 
Verwandte Themen