2017-06-07 4 views
-1

J'essaie d'écrire un programme pour le cours CS50, où j'ai besoin d'obtenir l'initiale des noms complets des personnes (et assurez-vous que tout est capitalisé).Erreur de segmentation lorsque l'entrée non capitalisée est donnée en raison d'un toupper utilisé dans une condition dans laquelle inturn est utilisée dans une boucle for [C]

Par conséquent, je fini par écrire ceci:

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


int main(void) 
{ 
    //Asks user for input and checks for it's length 
    printf("What's your name?\n"); 
    string full_name = get_string(); 
    int name_length = strlen(full_name); 
    //Program to select the intitials of each word 
    for(int i=0; i<name_length; i++) 
    { 
     char selectedchar = full_name[i]; //determines the currently selected character from the string on the basis of how many times the loop has run 
     if(selectedchar != ' ')   //Makes the program ignore any spaces before the name 
     { 
      if(selectedchar>='A' && selectedchar<='z') 
      { 
       printf("%c", toupper(full_name[i])); 
      }  
      else 
      { 
       printf("ERROR: INVALID INITIALS. (Check the characters used.)"); 
       return 1; 
      } 
     } 

     //To skip printing of non-initials 
     while(selectedchar != ' ') 
     { 
      i++; 
      selectedchar=full_name[i]; 
     } 

     if(i>=name_length)  //print a linebreak on the end of each run 
     {  
      printf("\n"); 
      return 0; 
     } 
    } 
} 

Maintenant, je whenver quelque chose d'entrée, je reçois une erreur de segment. E:

entrée Damien Chazelle Résultat: faute DCSegmentation (et saut de ligne)

d'entrée Dam en Chazelle Résultat: faute DCSegmentation (et saut de ligne)

entrée Damien Résultat: Défaut de segmentation (et saut de ligne)

entrée Damien Résultat: Segmentation fault (et saut de ligne)

Maintenant, je suis un débutant! Je n'ai absolument aucune idée de ce qui cause le problème ou comment écrire correctement cette question. (S'il vous plaît pardonnez-moi pour ça!)

+2

Votre boucle 'while' peut facilement sortir des limites. –

+1

place la condition 'if' dans la boucle' while'. Sinon, votre boucle while court à l'infini après le dernier espace et dans le défaut seg. –

+0

Merci à tous! Je l'ai résolu avec l'aide de vous tous! – Nomi

Répondre

2

Votre while -loop qui doit régler le pointeur sur l'ébauche suivante se déroulera en dehors des limites à chaque fois que l'espace est pas le dernier caractère de la chaîne:

while(selectedchar != ' ') 
    { 
     i++; 
     selectedchar=full_name[i]; 
    } 

Supposons une chaîne comme "Damien Chazelle", et supposons que i pointe vers le caractère : Puis, comme la chaîne ne contient plus d'espace à partir de cette position, i ne dépassera pas les limites de la chaîne. Notez que le caractère de fin de chaîne '\0' n'est pas égal à ' ', de sorte que la boucle passera au-dessus.

Sans interpréter le reste de votre code pour beaucoup, écrire

while(i < name_length && selectedchar != ' ') 

à la place.

+0

WOW!Je savais que la terminaison de chaîne (\ 0) n'équivalait pas à l'espace mais plutôt à elle-même, mais je l'ai tout simplement oubliée en écrivant! Ça m'étonne comment un tel détail a été oublié par moi! (Peut-être, c'est juste parce que je suis un newb) Eh bien, merci à tous! Tu m'as beaucoup aidé! – Nomi