paulo1205
(usa Ubuntu)
Enviado em 14/03/2023 - 06:27h
ViciadoEmLinux escreveu:
#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;
}
Estou usando o CodeBlocks.
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?
A função
scanf () é uma das funções mais complexas da biblioteca de funções padrão do C. Eu recomendo que você leia a documentação com cuidado. A
manpage de
scanf () que acompanha a
glibc (maioria absoluta das distribuições de Linux) é muito boa, tendo tudo o que você deve saber.
Vou explicar aqui de modo resumido, mas não deixe de ler a documentação da função.
A conversão
%s interpreta espaços em branco (inclui espaços propriamente dito, tabulações horizontal e vertical, quebra de linha, retorno de carro e quebra de página) como delimitadores do que vai ser convertido, o que significa que ela descarta espaços em branco no início da leitura, começa a converter após o primeiro caráter que não seja espaço, e termina a conversão quando encontra o próximo espaço em branco depois de ter iniciado a conversão.
Se você quiser ler uma
string que inclua espaços em branco usando
scanf (), sua melhor opção é usar a conversão
% . Essa conversão recebe como parâmetro uma lista de inclusão, que determina quais caracteres podem fazer parte da
string a ser convertida, ou uma lista de exclusão, que especifica quais caracteres não podem fazer parte da
string (o que, na prática, transforma os caracteres listados para exclusão em possíveis delimitadores da
string ). Além disso,
%[ não provoca o descarte de espaços antes de iniciar a leitura.
Um caso muito comum de uso da conversão
%[ é justamente o de ler todos os caracteres até o final da linha, usando uma lista de exclusão que especifica apenas a quebra de linha, conforme mostra o exemplo abaixo.
char nome[50];
int rc;
// +-------------------- Salva o valor de retono da função para poder testar
// | se a leitura foi bem sucedida ou não.
// |
// | +---------- Espaço em branco explícito significa descartar todos
// | | os espaços em branco, até encontrar algo que não seja
// | | espaço em branco (outras conversões, incluindo %s,
// | | implicam o descarte automaticamente; %[ e %c, não).
// | |
// | |+--------- “%” indica que vai começar uma especificação de
// | || convesrão a ser realizada.
// | ||
// | ||+-------- Especifica a quantidade máxima de caracteres que
// | ||| podem ser consumidos durante a conversão (49 bytes
// | ||| de dados úteis na string, mais um byte reservado para
// | ||| a marca de fim da string: 50 bytes no total).
// | |||
// | ||| +------ “[” especifica que é uma conversão de leitura de
// | ||| | string. Os caracteres que vêm a seguir designam
// | ||| | o parâmetro da conversão (i.e. se a lista de carac-
// | ||| | teres será de inclusão ou de exclusão).
// | ||| |
// | ||| |+----- “^” como primeiro caráter no parâmetro de “%[” indica
// | ||| || que os próximos caracteres são elementos de uma lista
// | ||| || de exclusão.
// | ||| ||
// | ||| ||+---- “\n” é o único caráter especificado na lista de
// | ||| ||| exclusão, o que significa que o único delimitador
// | ||| ||| da string (caso não exceda o tamanho máximo) é uma
// | ||| ||| quebra de linha.
// | ||| |||
// | ||| ||| +-- “]” marca o final da lista passada como argumento
// | ||| ||| | de “%[”.
// | ||| ||| |
// V VVV VVV V
rc=scanf(" %49[^\n]", nome);
Novamente, deixo a dica: leia por conta própria e com atenção a documentação da função.
... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)