2016-01-24 1 views
-2

Je travaille sur un projet d'initiales dans lequel vous entrez un nom et imprime les initiales. Lorsque j'essaie de combiner les chaînes, elle renvoie Segmentation fault au lieu des initiales.Le programme des initiales C a renvoyé "Erreur de segmentation"

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

int main(void) { 
    printf("Name: "); 
    string name = GetString(); 
    printf("\n"); 

    int length = strlen(name); 
    string initials = ""; 
    int arraylength = length + 1; 
    char string[arraylength]; 
    string[0] = toupper(name[0]); 
    int count = 1; 
    for(int l = 1;l<=length;l++) { 
     if(name[l] == ' ') { 
     l++; 
     count++; 
     string[l] = toupper(name[l]); 
    } 
} 
count++; 
string[count] = '\0'; 
for(int c = 0;c<=count;c++) { 
    strcat(initials, &string[c]); 
} 
printf("%s\n", initials); 
} 
+3

Q: quelle est exactement cette "chaîne" dans votre programme? Pouvez-vous copier/psater la définition de 'string', et le prototype de 'GetString()' dans votre message? Et vous ne pouvez pas utiliser 'strcat()' avec une variable "char". – paulsm4

+2

@ paulsm4 Rechercher le * cs50.h * Je ne pouvais pas le croire quand je l'ai vu hier. –

Répondre

3

Voilà pourquoi une chaîne Type cause de la confusion, vous faites un pointeur vers un seul omble chevalier. Et vous passez alors à strcat() c'est tout simplement faux.

Une chaîne, comme prévu par strlen() ou strcat() ou toutes str * fonctions, n'est pas simple un pointeur char qui est ce que le type string dans votre code est.

En une est en fait une séquence d'octets avec le dernier octet étant '\0', et ce n'est pas optionnel. Vous créez un pointeur sur un seul char et ce n'est pas la même chose qu'une chaîne que je viens de décrire.

Tout des str fonctions * essaieront de trouver le '\0' mais puisque vous avez passé l'adresse d'une variable de pile qui est pas un tableau, le comportement est indéfini lorsque l'une de ces fonctions tentent d'augmenter et déréférencer le pointeur passé.

Lorsque vous faites comprendre comment les chaînes fonctionnent en vous verriez que l'utilisation strcat() pour la concaténation de plusieurs morceaux d'une grande chaîne ensemble n'est pas très efficace, vous savez aussi que vous avez juste besoin d'ajouter un seul char et que vous pouvez en utilisant simplement la notation d'index, comme

char string[8]; 

string[0] = 'E'; 
string[1] = 'x'; 
string[2] = 'a'; 
string[3] = 'm'; 
string[4] = 'p'; 
string[5] = 'l'; 
string[6] = 'e'; 
string[7] = '\0'; // The very necessary terminator 
+0

En effet 'cs50.h 'est nul en raison de ce type de' chaîne'. Harvard n'est pas le meilleur endroit pour apprendre la programmation en C. – chqrlie

+0

@ iharob j'ai ajouté ça mais ça ne marche toujours pas –

+1

Vous avez ajouté quoi ,? votre code a beaucoup de problèmes. Essayez d'abord d'apprendre les chaînes [tag: c] et réécrivez le code. –