Pergunta

Eu sou um novato para C ++ e aprender com o Guia do MSDN C ++ Beginner o.

Enquanto tenta a função strcat ele funciona, mas eu recebo três caracteres estranhos no início.

Aqui está o meu 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;
}

E aqui está a saída

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

Eu me pergunto por Y} @ comparecer perante o meu nome?

Foi útil?

Solução

A matriz que você está criando é cheia de dados aleatórios. C ++ irá alocar o espaço para os dados, mas não inicializar a matriz com dados conhecidos. O strcat irá anexar os dados ao final da cadeia (a primeira '\ 0') como o conjunto de caracteres não foi inicializado (e está cheio de dados aleatórios), este não será o primeiro caractere.

Isto pode ser corrigido, substituindo

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

com

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

o = {0} irá definir o primeiro elemento a '\ 0' que é o símbolo seqüência de terminador, e c ++ irá preencher automaticamente todos para não elementos com '\ 0' especificado (desde que pelo menos um elemento é especificado).

Outras dicas

Você não está inicializando full_name, definindo o primeiro personagem a '\ 0' por isso há caracteres de lixo nele e quando você strcat você está adicionando seus novos dados após os caracteres de lixo.

O full_name variável não está a ser inicializado antes de ser acrescentado ao.

Alterar esta:

strcat(full_name,first_name);

a esta:

strcpy(full_name,first_name);

Você não pode ver qualquer problema em seu teste, mas sua seqüência space também não é depois de inicializar o seu único personagem com ' ' terminada em null.

Como já foi dito, você deve inicializar os dados, mas você já pensou sobre a aprendizagem da biblioteca padrão C ++? É mais intuitivo, por vezes, e provavelmente mais eficiente.

Com ele seria:

string full_name=first_name+" "+last_name;

e você não terá que se preocupar com terminação caracteres nulos. Para uma referência ir para a cplusplus

Oh e um exemplo de trabalho completo para que você possa entender melhor (do 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;
}

O problema é com seu texto space.

A função strcat requer uma cadeia de estilo C, que é zero ou mais caracteres, seguido por um valor nulo, de terminação, personagem. Assim, aquando da atribuição de matrizes para cordas de estilo C, você precisa alocar um personagem extra para o caractere de terminação nulo.

Assim, seu 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 em Scott Myers Effective C ++ e Mais Effective C ++ livros.

Cordas são em C e C terminada com nulo ++ (a função strcat é um legado de C). Isto significa que quando você aponta para um endereço de memória aleatório (new char [] variáveis ??apontar para um endereço de pilha com conteúdo aleatório que não se inicializado), o compilador irá interpretar tudo até o primeiro 0 (null) caracter \ como uma string (e vai além do tamanho alocado, se você usar a aritmética de ponteiro).

Isso pode levar a erros muito obscuras, questões de segurança (tampão explorações de estouro) e código muito ilegível e insustentável. compiladores modernos têm características que podem ajudar com a detecção de tais questões.

Aqui está um bom resumo das opções .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top