Des caractères étranges apparaissent lorsque vous utilisez la fonction strcat en C ++

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

  •  13-09-2019
  •  | 
  •  

Question

Je suis un débutant à C ++ et l'apprentissage du Guide du MSDN C ++ Débutant.

Tout en essayant la fonction strcat il fonctionne, mais je reçois trois personnages étranges au à commencer.

Voici mon code

#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;
}

Et voici la sortie

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

Je me demande pourquoi Y} @ comparaître devant mon nom?

Était-ce utile?

La solution

Le tableau que vous créez est plein de données aléatoires. C ++ allouera l'espace pour les données, mais ne pas initialiser le tableau avec les données connues. Le strcat joindra les données à la fin de la chaîne (le premier « \ 0 ») comme tableau de caractères n'a pas été initialisé (et est plein de données aléatoires) ce ne sera pas le premier caractère.

Ceci peut être corrigé en remplaçant

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

avec

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

la = {0} fixera le premier élément de « \ 0 » qui est le symbole de terminaison de chaîne, et c ++ se remplit automatiquement tous les éléments non spécifiés avec « \ 0 » (à condition que au moins un élément est spécifié).

Autres conseils

Vous n'êtes pas initialisez full_name en définissant le premier caractère « \ 0 » donc il y a des personnages de déchets dans et quand vous StrCat vous ajoutez vos nouvelles données après les personnages de déchets.

La full_name variable n'est pas en cours d'initialisation avant d'être ajouté à.

Changer ceci:

strcat(full_name,first_name);

à ceci:

strcpy(full_name,first_name);

Vous ne pouvez pas voir aucun problème dans votre test, mais votre chaîne de space est pas terminée par NULL après l'initialisation de son caractère uniquement avec ' '.

Comme d'autres l'ont dit, vous devez initialiser les données, mais avez-vous déjà pensé à l'apprentissage de la bibliothèque C ++ standard? Il est plus intuitif parfois, et probablement plus efficace.

Avec ce serait:

string full_name=first_name+" "+last_name;

et vous n'aurez pas à se soucier de mettre fin à des caractères nuls. Pour une référence aller à Cplusplus

Oh, et un exemple de travail complet pour que vous puissiez mieux comprendre (de l'opérateur + =):

#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;
}

Le problème est avec votre texte space.

La fonction strcat requiert une chaîne C-style, qui est de zéro ou plusieurs caractères suivis par une valeur nulle, se terminant, caractère. Ainsi, lors de l'attribution des tableaux pour les chaînes de style C, vous avez besoin d'allouer un caractère supplémentaire pour le caractère nul final.

Ainsi, votre 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. Investir dans Scott Myers efficace C ++ et plus efficace C ++ livres.

Les chaînes sont nulles à terminaison en C et C ++ (la fonction strcat est un héritage de C). Cela signifie que lorsque vous pointez vers une adresse mémoire vive (nouveau char [] les variables pointent vers une adresse de pile avec un contenu aléatoire qui ne reçoit pas initialisées), le compilateur interprétera tout au premier \ 0 (null) caractère en tant que chaîne (et aller au-delà de la taille allouée si vous utilisez l'arithmétique pointeur).

Cela peut conduire à des bugs très obscurs, les problèmes de sécurité (Exploits de dépassement de mémoire tampon) et le code illisible et très difficile à maintenir. Les compilateurs modernes ont des caractéristiques qui peuvent aider à la détection de ces problèmes.

Voici un bon résumé de vos options .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top