2012-08-06 6 views
6

Ahora vamos a ver a este pequeño programaC++: ¿Sobrepone strcat() o mueve el nulo?

char s[20]="One"; 
strcat(s,"Two"); 
cout<<s<<endl; 

Aquí, en primer s tiene el valor "uno" y para la representación visual este es el valor de s:

O - n - e - \ 0

Luego añadir "dos" al final de la cadena que produce esto:

O - N - e - T - W - O - \ 0

Ahora bien, como se puede ver el único nulo en la cadena al principio fue después de "Uno" ahora es después de "OneTwo"

Mi pregunta es: Es el nulo sobrescrito por la cadena "Dos" y luego agrega su propio nulo al final.

¿O es que el nulo que ya estaba allí al principio retrocedió para volver al final?

(Esta pregunta puede parecer no hacer una diferencia, pero me gustaría saber acerca de todo lo que aprendo)

Gracias

+4

Si está utilizando C++, no hay necesidad de 'strcat'. Use 'std :: string' y' + = '. – Drise

Respuesta

12

Se sobrescribe la primera \0 y se agrega una nueva \0 al final de la cadena concatenada. No hay margen para "mover" nada aquí. Estas son ubicaciones a las que se asignan los valores.

2

Sí, el \0 del primer argumento de strcat se sobreescribe, y se hace el último caracter de la cadena concatenada.

No movimiento como tal, la función simplemente añade \0 como el último carácter de la cadena concatenada.

2

La única manera de saberlo con certeza es mirar la fuente de su versión particular de strcat. La implementación típica sobrescribirá el primer nulo y copia el nulo de la segunda cadena en la última posición.

Sin embargo, esto realmente es muy quisquilloso, no podrá detectar la diferencia en la salida sin importar qué método se use.

4

Aunque la pregunta ha sido respondida correcta y repetidamente, puede ser bueno obtener la respuesta más oficial de la fuente ™. O al menos de las fuentes que puedo encontrar con Google.

This document, que afirma ser el estándar de C++ (o un borrador de trabajo del mismo), dice: biblioteca Standard

El C++ proporciona 209 funciones estándar de la biblioteca de C [incluyendo strcat]. - "Biblioteca C estándar", C.2.7, pg 811

Saltando por encima de this document que afirma ser el Estándar Internacional C, vemos:

La función strcat anexa una copia de la cadena apuntada por s2 (incluyendo el terminador nulo carácter) al final de la cadena apuntada por s1. El carácter inicial de s2sobrescribe el carácter nulo al final de s1. Si se produce una copia entre objetos que se superponen, el comportamiento no está definido.

- "La función strcat", 7.21.3.1, página 327

strcat en efecto, sobrescribir el carácter nulo.

Cuestiones relacionadas