2011-11-07 30 views
12

Prefiero solo usar una cadena, pero se supone que no debemos hacerlo ya que el profesor los odia y quiere que descubramos formas de evitarlos. Así que estudié el uso de una estructura, pero no estamos tan lejos en el libro y ella lo odia cuando salteo. Así que estaba pensando en hacer esto:C++ pasando la matriz de caracteres a la función

#include <iomanip> 
#include <iostream> 
#include <stdio.h> 

using namespace std; 

void myfunc(char&); 

int main() 
{ 
    char myname[12]; 
    cout<<"enter a name "; 
    cin>>myname; 
    cout<<"myname is "<<myname; 

    cout<<"myname is " << myfunc(myname); 

    getchar(); 
    getchar(); 
    return 0; 
} 

void myfunc(char &myname1) 
{ 
    myname1 = "Billy" 
} 

Pero esto no funciona y no sé por qué.

+5

Evitar 'std :: string' es francamente idiota excepto como un ejercicio de aprendizaje (y tal vez incluso entonces). Es una parte de la biblioteca estándar, y está diseñada para reemplazar los indicadores de caracteres desnudos y eliminar la mayoría de los diversos problemas asociados con ellos. Tu profesor suena como un adicto a C que quiere que escribas el código C en C++. – cHao

Respuesta

7

Una forma es hacerlo de esta manera:

void myfunc(char *myname1) 
{ 
    strcpy(myname1,"Billy"); 
} 

También tendrá que cambiar su principal a:

myfunc(myname); 
cout<<"myname is " << myname; 

Sin embargo hay que tener cuidado de no desbordar el búfer inicial.

La razón por la cual su código original no funciona es porque no puede asignar cadenas a char punteros. En su lugar, debe copiar la cadena al char*.

+0

El OP explica que no puede usar una cadena –

+1

Reparado, eliminó esa última oración. – Mysticial

1

Las matrices se transfieren a los punteros cuando se pasan como parámetros.
Así que la forma simple que lo que queremos es:

char* myfunc(char* myname1) 
{ 
    return myname1; 
} 

Si se va a mostrar que puede pasar la matriz por referencia.
Pero si no puede leer más adelante, no podrá usar esto.

char* myfunc(char (&myname1)[12]) // Note you can only pass arrays of size 12 
{        // to this function so it is limited in use. 
    return myname1; 
} 

para que sea más útil aunque se puede que la plantilla:

template<int SIZE> 
char* myfunc(char (&myname1)[SIZE]) 
{ 
    return myname1; 
} 
0

myname1 = "Billy" no copia una cadena se copia un puntero a la memoria local constante que contiene "Billy"

Take un vistazo a strncpy() o memcpy()

0

Pásalo como un char * en lugar de un char &. Está pasando una referencia a un solo carácter en lugar de un puntero a una matriz de caracteres en este código.

También use strncpy (google it) para establecer el valor de tr char * una vez que esté en la función.

0

void myfunc (char &); es el problema que debería tener un char * y no una referencia de char, que es lo que hiciste.

y en la función use strcpy (char * destination, char * source);

4

Esta línea de código es incorrecto:

cout<<"myname is " << myfunc(myname); 

myfunc() no devuelve nada, su tipo de retorno es void.

Trate de usar:

char* myfunc(char *myname1) 
{ 
    strcpy(myname1,"Billy"); 
    return myname; 
} 

O

myfunc(myname); 
cout<<"myname is " << myname; 
Cuestiones relacionadas