2012-04-10 14 views
17

Quiero saber por qué los primeros estados obras y no por eso segunda en C++Asignación de una cadena de caracteres a una matriz de caracteres

char a[10]="iqbal"; // it works 

a="iqbal"; // does not work 
+0

¿Esto es C o C++? Por favor especifica. –

+2

esto sale como estimación directa por la interfaz SO. Busque antes de publicar: posible duplicado de [Asignar cadenas a matrices de caracteres] (http://stackoverflow.com/questions/579734/assigning-strings-to-arrays-of-characters) –

Respuesta

18

En sentido estricto, una matriz no es un puntero! Y una matriz (dirección base de la matriz) no puede ser un lvalue modificable. es decir, no puede aparecer en el lado izquierdo de un operador de asignación. Las flechas se descomponen en punteros solo en ciertas circunstancias. Lea esto SO post para conocer cuándo las matrices se descomponen en punteros. Aquí está uno más nice article lo que explica las diferencias entre las matrices y punteros

también leer sobre lvalues ​​y rvalues ​​here de manera que se obtiene una idea de las cosas que no pueden aparecer en la LHS de =

char a [10 ] = "iqbal"; // funciona

En este caso, lo que ocurre internamente es

a[0] = 'i'; 
a[1] = 'q'; 
. 
. 
a[5] = '\0'; 

Así que todo está bien como array[i] es un valor-modificable.

a = "iqbal"; // no funciona

Internamente, esto es más o menos equivalente a

0x60000(Address of a, but is a simple number here) = Address of "iqbal" 

Esto es un error ya que no podemos asignar algo a un número.

+2

En realidad, 'a' es modificable lvalue, pero no puede aparecer en el lado izquierdo del operador de asignación. El significado de l y r en lvalue y rvalue se perdió hace mucho tiempo. – avakar

+0

'a' puede ser un lvalue pero no un _modificable_ lvalue y _herencia_ no puede aparecer en el LHS de' = '? ¿Me puede indicar alguna documentación si estoy equivocado? Voy por [esto] (http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7a.doc%2Flanguage%2Fref%2Fclrc05lvalue.htm) –

+0

@PavanManjunath: Considere pasar 'a' como argumento real a una función con referencia al argumento formal de la matriz. Claramente, 'a' es un lvalue en este caso, y modificable. Y el valor o valor de una expresión no depende del contexto, por lo tanto, 'a' es un valor l modificable. –

3

La primera línea no es una declaración sino una declaración con una inicialización. La segunda línea es una declaración de expresión con el operador de asignación.

No puede asignar matrices en C.

Pero se puede inicializar una matriz con los elementos de una cadena literal.

4

La matriz de caracteres a será estática y no se puede cambiar si la inicializa de esta manera. De todos modos, nunca se puede asignar una cadena de caracteres a = "iqbal" en c. Tienes que usar strncpy o memcpy para eso. De lo contrario, intentará sobrescribir el puntero a la cadena, y eso no es lo que quiere.

Así que el código correcto sería hacer algo como:

char a[10]; 
strncpy(a, "iqbal", sizeof(a) - 1); 
a[sizeof(a) - 1] = 0; 

La -1 es para reservar un byte para el cero de terminación. Tenga en cuenta que deberá comprobar usted mismo si la cadena tiene un valor nulo o no. Mala api. Hay una llamada strlcpy() que hace esto por usted pero no está incluida en glibc.

0

Al escribir char a [10] = "Iqbal" va a inicializar los elementos de la matriz de caracteres un con los personajes. Podemos hacer lo mismo con int tipo (tenga en cuenta que el tipo char recibe un tratamiento ligeramente diferente): int a [10] = {1,2, ...};

Pero escribir lo siguiente después de que la parte de declaración no sea válida como , se trataría como un puntero. Así que escribir algo como a = {1,2, ...}; o a = "iqbal" ¡no tendrá sentido!

1

por qué los primeros estados obras y por qué no segundo en C++

Debido a que son diferentes declaraciones, casi totalmente sin relación. No se deje confundir por el hecho de que ambos usan el símbolo =. En un caso, representa la inicialización del objeto. En el otro caso, el operador de asignación.

Su primera línea es legal porque es legal inicializar agregados, incluidas las matrices de caracteres.

Su segunda línea no es legal porque no es legal asignarla a una matriz.

Dado que esto es C++, ¿puedo sugerir que evite matrices desnudas? Para cadenas de caracteres use std::string. Para otras matrices, use std::vector. Si lo hace, se convierte en ejemplo:

std::string a = "iqbal"; // it works 
a="iqbal"; // so does this 
0

intento:

char a[10]="iqbal"; 
char *my_a = a; 

y trabajar con my_a.

Cuestiones relacionadas