Programa nome em C não funciona

Fiz o seguinte programa em C,Só que a variável nomeCompleto deve estar errada,porque eu digito o meu nome completo no programa,e aparece na tela em nome Completo um ponto de interrogação ao imprimir a palavra:

#include <stdio.h>
#include <string.h>
 
int main (void){
  char nome[50], sobrenome[50], nomeCompleto[100];
  
  printf("Qual o seu nome? ");
  scanf("%s", nome);
  printf("Qual o seu sobrenome? ");
  scanf("%s", sobrenome);
 
      strcpy(nomeCompleto, nome);
      strcat(nomeCompleto, " ");
      strcat(nomeCompleto, sobrenome);
  
  printf("Qual o seu nome completo: %s\n", nomeCompleto);
  
  return 0;
}

O que há de errado com o meu programa,alguém pode me ajudar? desde já agradeço.Estou usando o programa Geany no Linux Debian 11 para aparecer a palavra na tela.

Essa instrução está ao contrário.
Você tem que copiar nome para o nomeCompleto.

Eu troquei,mas dá isso ai em baixo:

O programa não tem como fazer um pouco diferente para funcionar?

Vê se eu fiz certo no programa abaixo:

Por mais estranho que pareça, não está ao contrário. Veja na documentação que a função é definida como:

char *strcpy( char *dest, const char *src );

Eu diria que isso vai contra o “senso comum”, eu também prefiro a ordem “origem - destino” pra qualquer coisa, mas no caso de strcpy é assim mesmo…


@WhiteHat Eu testei aqui e funcionou, veja. Usei gcc 9.4.0 no Ubuntu 20.04.

Enfim, outra forma de fazer é usar sprintf:

char nome[50], sobrenome[50], nomeCompleto[100];
printf("Qual o seu nome? ");
scanf("%s", nome);
printf("Qual o seu sobrenome? ");
scanf("%s", sobrenome);

sprintf(nomeCompleto, "%s %s", nome, sobrenome);
printf("Qual o seu nome completo: %s\n", nomeCompleto);

Aproveitando o assunto e indo um pouco além, o problema de usar strcat várias vezes na mesma string é que, cada vez que ela é chamada, precisa percorrer toda a string desde o início, para só depois adicionar a outra string no final. Se tiver muitas concatenações, isso pode se tornar bem ineficiente, e está explicado em mais detalhes aqui.


Por fim, se for somente para imprimir, poderia fazer tudo direto no printf e nem precisaria de nomeCompleto:

printf("Qual o seu nome completo: %s %s\n", nome, sobrenome);
1 curtida
#include <stdio.h>
#include <string.h>

int main (void){
	
char nome[50], sobrenome[50], nomeCompleto[100];
printf("Qual o seu nome? ");
scanf("%s", nome);
printf("Qual o seu sobrenome? ");
scanf("%s", sobrenome);

sprintf(nomeCompleto, "%s %s", nome, sobrenome);
printf("Qual o seu nome completo: %s\n", nomeCompleto);
   
   return 0;

}

Fiz como tu mandou,mas mesmo assim aparece essa tela de ponto de interrogação.

Tenho o gcc mais atual na minha máquina.será que esse programa geany que está com problema?

Em primeiro lugar o problema era no Geany,no codeblocks funcionou veja:

Só que o programa está incompleto ainda,em Nome(Eu tenho que digitar João Santos) e em sobrenome eu tenho que digitar(Vieira Junior) ou Seja meu nome completo é João Santos Vieira Junior,e porque que o programa não imprimi o meu nome completo?

Talvez seja o encoding do terminal do Geany que não aceita caracteres acentuados. Vc testou com nomes sem acento?

Enfim, pode ser que adicionando o cabeçalho #include <locale.h> e depois chamando setlocale(LC_ALL, "en_US.utf8"); no início do main resolva.

Ou então vc pode alterar o programa para usar wide char:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <wchar.h>

int main() {
    setlocale(LC_ALL, "en_US.utf8");
    wchar_t nome[50], sobrenome[50], nomeCompleto[100];

    printf("Qual o seu nome? ");
    wscanf(L"%ls", nome);
    printf("Qual o seu sobrenome? ");
    wscanf(L"%ls", sobrenome);

    swprintf(nomeCompleto, 100, L"%ls %ls", nome, sobrenome);

    printf("Qual o seu nome completo: %ls\n", nomeCompleto);
    return 0;
}

Quanto ao outro problema, é que %s não lê espaços mesmo. Até daria pra usar coisas como scanf("%[^\n]", nome);, mas na verdade o recomendado é usar fgets (para saber mais, leia aqui - e siga todos os links que tem lá, para entender porque scanf não é uma boa opção).

O detalhe chato é que fgets inclui o caractere de quebra de linha no final da string (pois equivale ao ENTER), então temos que retirá-lo manualmente:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// função auxiliar para ler a string e remover a quebra de linha no final
char *ler_texto(const char *prompt, char *buffer, size_t buflen, FILE *fp) {
    puts(prompt);
    if (fgets(buffer, buflen, fp) != 0) {
        size_t len = strlen(buffer);
        // se tem a quebra de linha no final, remove
        if (len > 0 && buffer[len - 1] == '\n') {
            buffer[len - 1] = '\0';
        }
        return buffer;
    }
    // não conseguiu ler, retorna zero
    return 0;
}

int main() {
    char nome[50], sobrenome[50], nomeCompleto[100];
    if (! ler_texto("Qual o seu nome? ", nome, 50, stdin)) {
        printf("Erro ao ler o nome\n");
        exit(-1);
    }
    if (! ler_texto("Qual o seu sobrenome? ", sobrenome, 50, stdin)) {
        printf("Erro ao ler o sobrenome\n");
        exit(-1);
    }
    sprintf(nomeCompleto, "%s %s", nome, sobrenome);
    printf("Qual o seu nome completo: %s\n", nomeCompleto);
    return 0;
}
1 curtida

Agora funcionou com o ultimo programa que você fez:

Obrigado Amigo.

Fechado conforme solicitado.