2016-09-17 1 views
0

J'essaye d'écrire un programme C simple qui prend l'entrée d'un nombre et retourne la somme des chiffres du nombre aussi bien que l'inverse du nombre. Le programme est actuellement incomplet car je continue à rencontrer des erreurs de segmentation lors du test.C - Défaut de segmentation (core dumped)

Voici le 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; 
} 

En utilisant des instructions d'impression, je l'ai découvert que l'erreur la plus probable se produit quelque part dans ces lignes:

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

Je suis en mesure d'entrer dans un nombre, mais immédiatement après cela, je reçois un message disant Segmentation Fault (core dumped) et le programme se termine. L'exécution du programme avec les privilèges sudo fournit uniquement une erreur de segmentation, sans la partie "core dumped" du message.

informations de débogage fournies par les instructions suivies here semble indiquer que l'instruction printf est ce qui est à l'origine de l'erreur, car cela est la sortie:

(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 

Cependant, je ne sais pas quoi faire avec ce informations, donc je ne peux pas résoudre l'erreur.

J'ai demandé l'aide de mon professeur pour cette même erreur en laboratoire, et il n'a pas été capable de trouver une solution. C'est ce qui est arrivé dans deux laboratoires différents maintenant, plus avec ce projet, ce qui me fait penser que cela peut être quelque chose avec la configuration de mon ordinateur plutôt qu'avec le code lui-même. J'écris le programme en utilisant vim et en compilant avec gcc. Dans la plupart des cas, je ne renomme pas la sortie du compilateur, donc je l'utilise avec "./a.out". J'utilise Fedora 24 pour écrire et exécuter ces programmes. Si d'autres informations sur mon système sont nécessaires, s'il vous plaît faites le moi savoir.

+1

comportement non défini pour le passage d'un '' int' à printf() '' avec une conversion% en s'. – EOF

+0

Mon compilateur sur mon ordinateur n'a pas attrapé l'erreur de formatage de chaîne pour une raison quelconque. J'ai téléchargé le fichier sur le serveur Linux de mon université et je l'ai compilé là-bas, ce qui m'a donné l'exception et le correctif. Merci à tous pour votre aide, je me sens comme un idiot pour un si petit problème. –

Répondre

0

changement

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

à

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

%s est pour les chaînes non pour les entiers (%d est pour les entiers signés).

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

+0

Merci de l'avoir signalé. Pour une raison ou une autre, le compilateur de mon ordinateur n'a pas compris cela, mais quand je l'ai téléchargé sur le serveur Linux de mon université et compilé, il a jeté une exception. –

+0

@SamSchmalzried Ce n'est pas quelque chose qui sera généralement détecté, car tout compilateur doit savoir que 'printf()' prend une chaîne arbitraire et un ensemble d'arguments variés (et donc nécessairement arbitraires), tous deux vous avez fourni. Vérifier si les arguments que vous avez fournis ont un sens en combinaison nécessiterait beaucoup d'acrobaties - et éventuellement d'instrumentation pour les arguments variadiques, idk - que la plupart des compilateurs ne perdront pas de temps, sauf si vous leur dites explicitement. Sinon, ils supposent simplement que vos arguments ont du sens. –

0

Vous avez utilisé spécificateur de format incorrect dans les printf() fonctions, modifier à:

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

et il fonctionne correctement (%d représente décimal (chiffres) et %s est synonyme de cordes).

0

J'ai couru votre code et il fonctionne, mais vous devez changer le printf("Sum of digits: %s", sum); soit printf("Sum of digits: %i", sum); ou printf("Sum of digits: %d", sum);

Il n'y a pas de différence dans l'utilisation %d ou %i en printf() parce que:

  1. Les spécificateurs de conversion et leurs significations sont: d, i - l'argument int est conver ted à décimal signé dans le style [-] dddd. La précision spécifie le nombre minimum de chiffres à afficher; Si la valeur en cours de conversion peut être représentée en moins de chiffres, elle est étendue avec des zéros en tête. La précision par défaut est 1. Le résultat de convertissant une valeur zéro avec une précision de zéro est aucun caractère. Source: normes C99 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf

Cependant, il y a une différence lors de l'utilisation %d ou %i en scanf() parce que le premier est stocké sous forme d'entier décimal et celui-ci comme un entier. Source: https://cs50.harvard.edu/resources/cppreference.com/stdio/scanf.html

Le code que je courais cela fonctionne:

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