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