Programa nome não digita o meu nome completo

1. Programa nome não digita o meu nome completo

João Santos Vieira Junior
ViciadoEmLinux

(usa Debian)

Enviado em 19/01/2023 - 09:09h

#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?


  


2. Re: Programa nome não digita o meu nome completo

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 19/01/2023 - 09:10h

R: Utilizando o código apresentado, o programa está incompleto porque não realiza a correta junção da variável nomeCompleto. Para sair deste problema, você deve utilizar a função strcat() para concatenar o nome completo. Por exemplo, se o seu nome e sobrenome fossem "João Santos", a linha para concatenar o nome completo ficaria assim:


strcat(nomeCompleto, "João");
strcat(nomeCompleto, " ");
strcat(nomeCompleto, "Santos");


Em seguida você deverá adicionar mais linhas de código para ler os outros campos (mesmo que você esteja buscando apenas o nome completo) de forma a poder chamar a função strcat para cada campo. Caso tenha dúvidas, sugiro solicitar ajuda no fórum do site Viva o Linux.


3. Re: Programa nome não digita o meu nome completo

Olavo Borges De Sá Loureiro
GriffoDeRuppell

(usa Linux From Scratch)

Enviado em 13/03/2023 - 23:45h

Aqui etá um exemplo para "capturar uma string com espaços"
#include <stdio.h>

int main () {
char str[50];

printf("Enter a string : ");
gets(str);

printf("You entered: %s", str);

return(0);
}


4. Re: Programa nome não digita o meu nome completo

Paulo
paulo1205

(usa Ubuntu)

Enviado em 14/03/2023 - 04:53h

A função gets() não deve ser usada. Por ser insegura (ela não permite limitar a quantidade de caracteres lidos para string, permitindo a um eventual atacante enviar mais caracteres do que o tamanho reservado na variável array que vai recebê-los), ela foi marcada como obsoleta no padrão do C de 1999 e removida na versão do padrão atualizada em 2011.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


5. Re: Programa nome não digita o meu nome completo

Paulo
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)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts