2014-05-07 1 views
-2

J'essaie de créer un programme qui lit une "chaîne" (dans un char *) à partir de l'entrée utilisateur, puis en utilisant cstring, il obtient la longueur de ce que le char * est pointant vers. D'après ce que je comprends, char * est un pointeur. Une référence à un pointeur sera redirigée vers ce qu'il pointe vers. Dans ce cas, le mot devrait pointer sur 4321, et quand le mot est sorti, ce qu'il pointe sur ce qui est réellement produit. Aussi, strlen devrait lire jusqu'au \ 0, ce qui dans ce cas la chaîne devrait être 4321 \ 0, alors pourquoi la faute de segmentation?C++ Recherche de la longueur d'un pointeur char

Résultat souhaité:

Enter a string: 4321 
4321 
(length of 4321) 

Programme:

#include <iostream> 
#include <cstring> 
using namespace std; 

int main() 
{ 
    char *word; 
    int len; 

    cout << "Enter a string: "; 
    cin >> word; 

    len = strlen(word); //why does this cause a segmentation fault? 

    cout << word << endl; 
    cout << len << endl; 

    return 0; 
} 
+1

Vous n'avez pas initialisé 'word' donc il contient des ordures pointant vers un emplacement aléatoire dans la mémoire. Vous avez essayé de lire dans cet endroit aléatoire. Le système d'exploitation vous a dit sagement que vous ne pouvez pas faire cela. –

+0

Dans le futur, vous voudrez peut-être attendre un peu avant d'accepter les réponses. –

Répondre

4

Vous devez

char word [256] ; // or something 

Mieux encore

std::string word ; 


cout << word.length() ; 
+1

mot est un pointeur sans tampon de données que vous l'avez. – user3344003

+0

Mais "char * word" et "char word [256]" devraient être la même chose, à part que ce dernier est limité à 255 éléments à l'exclusion de '\ 0'. – user2871213

+0

mot char [256]; crée un pointeur vers un tampon contenant 256 octets. char * mot; crée un pointeur sur rien (jusqu'à son affectation). – user3344003

1

Dans votre code "mot" est juste un pointeur. Si vous voulez écrire quelque chose directement dans un pointeur, vous devez d'abord lui attribuer une adresse mémoire valide. Si ce n'est pas important pour vous que "mot" est un pointeur, alors un tableau char sera suffisant.