caracteres extraños aparecen cuando se utiliza la función strcat en C ++

StackOverflow https://stackoverflow.com/questions/1853619

  •  13-09-2019
  •  | 
  •  

Pregunta

Soy un novato en C ++ y aprendiendo de la Guía de MSDN C ++ para principiantes.

Al tratar de la función strcat que funciona, pero me sale tres caracteres extraños en el comenzando.

Aquí está mi código

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

int main() {
    char first_name[40],last_name[40],full_name[80],space[1];
    space[0] = ' ';
    cout << "Enter your first name: ";
    gets(first_name);
    cout << "Enter your last name: ";
    gets(last_name);
    strcat(full_name,first_name);
    strcat(full_name,space);
    strcat(full_name,last_name);
    cout << "Your name is: " << full_name;
    return 0;
}

Y aquí está la salida

Enter your first name: Taher
Enter your last name: Abouzeid
Your name is: Y}@Taher Abouzeid

Me pregunto por qué Y} @ aparece delante de mi nombre?

¿Fue útil?

Solución

La matriz que se está creando está lleno de datos aleatorios. C ++ asignará el espacio para los datos, pero no inicializar la matriz con los datos conocidos. El strcat adjuntará los datos al final de la cadena (la primera '\ 0') como el conjunto de caracteres no se ha inicializado (y está lleno de datos aleatorios) esto no va a ser el primer carácter.

Esto podría ser corregido mediante la sustitución

char first_name[40],last_name[40],full_name[80],space[1];

con

char first_name[40] = {0};
char last_name[40] = {0};
char full_name[80] = {0};
char space[2] = {0};

el = {0} establecerá el primer elemento a '\ 0' que es el símbolo cadena de terminador, y c ++ llenará automáticamente todos los elementos no especificados con '\ 0' (siempre que se especifica al menos un elemento).

Otros consejos

No está inicializando FULL_NAME estableciendo el primer personaje en '\ 0' por lo que hay caracteres de basura en ella y cuando strcat está añadiendo nuevos datos después de los caracteres de basura.

El full_name variable no se inicializa antes de ser añadido a.

Cambiar esto:

strcat(full_name,first_name);

a esto:

strcpy(full_name,first_name);

No se puede ver cualquier problema en su prueba, pero la cadena de space tampoco es terminada en cero después de inicializar el único personaje con ' '.

Como otros han dicho, debe inicializar los datos, pero que nunca han pensado en el aprendizaje de la norma ++ biblioteca de c? Es más intuitivo veces, y probablemente más eficiente.

Con él sería el siguiente:

string full_name=first_name+" "+last_name;

y usted no tendrá que preocuparse con la terminación de caracteres nulos. Para una referencia ir a cplusplus

Ah, y un ejemplo de trabajo completo para que puedas entender mejor (de operador + =):

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

int main ()
{
  string name ("John");
  string family ("Smith");
  name += " K. ";         // c-string
  name += family;         // string
  name += '\n';           // character

  cout << name;
  return 0;
}

El problema es con el texto space.

La función strcat requiere una cadena de estilo C, que es cero o más caracteres seguidos de un valor nulo, de terminación, carácter. Por eso, cuando la asignación de matrices de cadenas estilo C, es necesario asignar un carácter adicional para el carácter nulo de terminación.

Por lo tanto, su space array needs to be of length 2, one for the space character and one for the null character.

Since space is constant, you can use a string literal instead of an array:

const char space[] = " ";

Also, since you are a newbie, here are some tips:
1. Declare one variable per line.
This will be easier to modify and change variable types.

2. Either flush std::cout, use std::endl, or include a '\n'.
This will flush the buffers and display any remaining text.

3. Read the C++ language FAQ.
Click here for the C++ language Frequently Asked Questions (FAQ)

4. You can avoid C-style string problems by using std::string


5. Invertir en Scott Myers A partir del C ++ y C ++ más eficaz los libros.

Las cadenas son terminada en nulo en C y C ++ (la función strcat es una herencia de C). Esto significa que cuando se apunta a una dirección de memoria aleatoria (nuevo char [] variables que apuntan a una dirección de pila con contenido aleatorio que no recibe inicializado), el compilador interpretar todo hasta el primer carácter \ 0 (cero) como una cadena (e irá más allá del tamaño asignado si utiliza la aritmética de punteros).

Esto puede conducir a errores muy oscuros, las cuestiones de seguridad (vulnerabilidades de desbordamiento del búfer) y código muy ilegible e imposible de mantener. compiladores modernos tienen características que pueden ayudar a la detección de este tipo de problemas.

Aquí es un buen resumen de sus opciones .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top