2012-03-04 32 views
8

Estoy aprendiendo C++ y actualmente estoy trabajando con cadenas y punteros.Cadenas y punteros en C++

estoy siguiendo un libro de ejercicios y para una de las preguntas que he creado el siguiente:

#include <iostream> 
#include <string> 

using namespace std; 

int main(void){ 
    string * firstName=nullptr; 
    string * lastName=nullptr; 
    string * displayName=nullptr; 

    cout << "Enter your first name: " << endl; 
    getline(cin,*firstName); 

    cout << "Enter your last name: " << endl; 
    getline(cin,*lastName); 

    displayName=new string; 
    *displayName= *lastName + ", " + *firstName; 

    cout << "Here's the information in a single string: " << displayName; 
    cin.get(); 
    return 0; 
} 

En un intento de usar más de punteros que he tratado de mezclar juntos con cuerdas y han hecho la solución más compleja por esta razón. Cuando ejecuto esto obtengo una "Excepción no controlada: acceso a la ubicación de lectura de violación xxxxxxxxx".

¿Puede alguien sugerir una solución a esto utilizando punteros y cadenas en lugar de matrices de caracteres (que ya he descubierto cómo hacerlo)?

+3

No está asignando las cuerdas, y luego se pasa un puntero nulo el de 'getline()' función ... acaba de cambiar toda la cadena '* x = nullptr;' a 'string x;' o asignar las cadenas como lo hace con 'displayName' antes de pasarlas a' getline() ' – Yaniro

+1

Si recién está comenzando a" aprender C++ ", no debería ir a ninguna parte cerca de punteros sin formato. Son una parte difícil, avanzada y nicho de C++ que no debería necesitar para la mayoría de las actividades de programación "normales". –

+0

Este [fragmento de video] (http://www.youtube.com/watch?v=i49_SNt4yfk) siempre fue muy inspirador cuando estaba confundido acerca de los punteros ;-) –

Respuesta

12

Esto es porque usted tiene no asignar sus objetos antes de usarlos:

string * firstName = new string(); 
//... 
delete firstName; 

Vale la pena añadir que el uso de punteros en esta situación es, así, sin sentido: los objetos de cadena en el estándar de C++ biblioteca de asignar los datos para la cadena del montón; las cadenas generalmente no son mucho más que un par de punteros de todos modos.

+4

jajaja inútil: ') – Rishi

2

Se vería así:

int main() 
{ 
    std::string* s = new std::string; 
    std::getline(std::cin, *s); 
    std::cout << *s; 
    delete s; 
} 

Pero en realidad no hay razón para hacerlo, basta con definir una variable de cadena normales en la pila.

0

Dado que está utilizando nullptr, supongo una solución en toda regla C++ 11 es igualmente bien:

#include <iostream> 
#include <memory> 
#include <string> 

using namespace std; 

int main(void){ 
    unique_ptr<string> firstName(new string()); 
    unique_ptr<string> lastName(new string()); 
    unique_ptr<string> displayName(new string()); 

    cout << "Enter your first name: " << endl; 
    getline(cin,*firstName); 

    cout << "Enter your last name: " << endl; 
    getline(cin,*lastName); 

    *displayName= *lastName + ", " + *firstName; 

    cout << "Here's the information in a single string: " << *displayName; 
} 

Por supuesto utilizando nullptr no era lo que quería: es necesario asignar los recursos que quiere usar.

Tenga en cuenta que usar punteros en estos casos simples es dispararse en el pie, tanto a nivel de sintaxis como de error.

EDITAR que corrige el código (un paréntesis olvidado y el * en la última línea de main), que succesfuly compila y se ejecuta en GCC 4.7.

+0

Gracias por eso. Aún recibo el error de excepción no controlada del archivo xstring. ¿Cree que Visual Studio tiene un problema? Aprecio que no debería estar haciendo esto, me alejaré de él y me limitaré a lo básico de usar cuerdas. – Dan

+0

@Dan corrigió el código. – rubenvb

2

Creo que no desea utilizar pointers en absoluto. Puede trabajar con strings sin punteros.

#include <iostream> 
#include <string> 

using namespace std; 

int main(void){ 
    string firstName; 
    string lastName; 
    string displayName; 

    cout << "Enter your first name: " << endl; 
    getline(cin,firstName); 

    cout << "Enter your last name: " << endl; 
    getline(cin,lastName); 

    displayName= lastName + ", " + firstName; 

    cout << "Here's the information in a single string: " << displayName; 
    cin.get(); 
    return 0; 
} 

othewise, si necesita punteros, usted tiene que asignar memoria para las variables:

cout << "Enter your first name: " << endl; 
    firstName = new string(); 
    getline(cin,*firstName); 

... y el resultado de impresión con el operador eliminar la referencia (*):

cout << "Here's the information in a single string: " << *displayName; 
0

Leer el 10 commandments of c programming. Algunos son más o menos obsoleto para desarrolladores de hoy en día, pero algunos son todavía importantes, tales como la segunda:

No pondrás siguen el puntero NULL, para el caos y la locura te esperan en su extremo.

Eso es lo que estás haciendo aquí. Sus punteros no apuntan a ningún lado (consulte las asignaciones al std::nullptr).

Para corregir esto, debe asignar un nuevo objeto de la clase/estructura correcta al puntero. Además, no se olvide de eliminar más adelante:

std::string *myString = new std::string(); // create an object and assign it's address to the pointer 

// do something with it... (this part has been right) 

delete myString; // free the memory used by the object 
2

se producen errores porque está utilizando cadenas como punteros y no se está inicializando ellos. Una forma correcta de hacer esto sería:

#include <iostream> 
#include <string> 

using namespace std; 

int main(void){ 
    string firstName; 
    string lastName; 
    string displayName; 

    cout << "Enter your first name: " << endl; 
    cin >> firstName; 

    cout << "Enter your last name: " << endl; 
    cin >> lastName; 

    displayName = firstname + ' ' + lastName; 


    cout << "Here's the information in a single string: " << displayName << endl; 
    return 0; 
} 

Usted puede utilizar realmente punteros a cadenas, sino que están destinados a ser utilizados como objeto local y pasa alrededor como referencias o referencias (const, si lo desea).

1

La infracción de acceso se debe a que está desmarcando un puntero nulo.

puntero nulo se establece aquí

string * firstName=nullptr; 

y luego se eliminan las referencias aquí

getline(cin,*firstName) 

Es necesario tener apellido 'punto' a algo (una cadena en este caso). Aquí hay una versión modificada sin excepciones.

int main(void){ 
    string * firstName= new string(); 
    string * lastName=new string(); 
    string * displayName=new string(); 

    cout << "Enter your first name: " << endl; 
    getline(cin,*firstName); 

    cout << "Enter your last name: " << endl; 
    getline(cin,*lastName); 

    //displayName=new string; 
    *displayName= *lastName + ", " + *firstName; 

    cout << "Here's the information in a single string: " << displayName->c_str(); 
    cin.get(); 
    return 0; 
} 
+0

Hola, esto todavía me da una excepción no controlada. Me estoy alejando de este método y me atengo a la ruta fácil. Gracias – Dan

+0

Acabo de descubrir que era yo quien estaba causando el error después de que arreglé el programa. Apreciamos mucho la ayuda. – Dan