Não consigo ler string com espaço [RESOLVIDO]

1. Não consigo ler string com espaço [RESOLVIDO]

Lucas Rafael Barbosa Lopes
lucas7844

(usa Ubuntu)

Enviado em 07/08/2017 - 01:55h


#include <stdio.h>
struct usuario{
char nome[20], sobrenome[30], email[30], id[20], senha[11];
}Cadastro;
int cadastro(void){

printf("Funcao Cadastro\n");
printf("Faça seu cadastro aqui.\n");

printf("\nprimeiro nome: ");
scanf("%s", Cadastro.nome);

printf("sobrenome: ");
scanf("%s[^\n]", Cadastro.sobrenome);

printf("email: ");
scanf("%s", Cadastro.email);

printf("id de acesso(unico): ");
scanf("%s", Cadastro.id);

printf("senha[maximo 10]: ");
scanf("%s[^\n]", Cadastro.senha);

return 0;
}



no sobrenome quando digito algo com espaço e aperto enter, vai logo para o id e

scanf("%[^\n]s", variavel);

não funciona. obs: está é uma parte do programa.


  


2. Re: Não consigo ler string com espaço

Jose Renan
JoseRenan

(usa Ubuntu)

Enviado em 07/08/2017 - 10:28h

scanf("%s[^\n]", Cadastro.sobrenome);

O uso aqui do "s" que deve tá errado, pq ele vai pegar a primeira sequência de caracteres até um espaço em branco ou ler o tanto que couber no array.
Segundo a documentação:
s

Matches a sequence of non-white-space characters; the next pointer must be a pointer to character array that is long enough to hold the input sequence and the terminating null byte ('\0'), which is added automatically. The input string stops at white space or at the maximum field width, whichever occurs first.

Já com o c.
c

Matches a sequence of characters whose length is specified by the maximum field width (default 1); the next pointer must be a pointer to char, and there must be enough room for all the characters (no terminating null byte is added). The usual skip of leading white space is suppressed. To skip white space first, use an explicit space in the format.

Fonte: https://linux.die.net/man/3/scanf

Tente assim: scanf("%[^\n]", Cadastro.sobrenome);



3. Re: Não consigo ler string com espaço [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 07/08/2017 - 12:31h

Você tem um problema com a string de formatação. Não se deve dizer “scanf("%[^\n]s", str)”, pois isso significa que você vai tentar ler uma sequência de caracteres diferentes de '\n' seguida do caráter 's'. Se você reparar bem, essa sequência nunca vai ocorrer.

O que você provavelmente quis dizer foi “scanf("%[^\n]%*1[\n]", str)”, para ler uma para dentro de str uma string até achar um '\n', e depois suprimir o '\n' que vem logo após o fim da string lida, para que ele não seja deixado no buffer é impacte a leitura seguinte.

E o problema de ficar com a leitura vazia foi justamente não ter consumido o '\n' do final da leitura anterior. Quando essa quebra de linha aparece para uma conversão que disse que quer apenas caracteres diferentes da quebra de linha, essa leitura vai imediatamente falhar.

Quando você quiser ler linhas, no entanto, considere usar fgets() ou getline(). Mas lembre-se de que você ainda terá de garantir que removeu quebras de linhas vindas de leituras anteriores, mesmo com essas funções.


4. Re: Não consigo ler string com espaço [RESOLVIDO]

Giovane Oliveira
GiovaneOliveira

(usa Debian)

Enviado em 08/08/2017 - 10:21h

A função "gets"?
Ficaria assim:
gets(cadastro.nome);


O conhecimento só é adquirido quando o mesmo é compartilhado.
Giovane Oliveira
Acadêmico de Sistemas de Informação
e-mail: giovaneoliveira4@gmail.com


5. Re: Não consigo ler string com espaço [RESOLVIDO]

Lucas Rafael Barbosa Lopes
lucas7844

(usa Ubuntu)

Enviado em 08/08/2017 - 12:31h

JoseRenan escreveu:

scanf("%s[^\n]", Cadastro.sobrenome);

O uso aqui do "s" que deve tá errado, pq ele vai pegar a primeira sequência de caracteres até um espaço em branco ou ler o tanto que couber no array.
Segundo a documentação:
s

Matches a sequence of non-white-space characters; the next pointer must be a pointer to character array that is long enough to hold the input sequence and the terminating null byte ('\0'), which is added automatically. The input string stops at white space or at the maximum field width, whichever occurs first.

Já com o c.
c

Matches a sequence of characters whose length is specified by the maximum field width (default 1); the next pointer must be a pointer to char, and there must be enough room for all the characters (no terminating null byte is added). The usual skip of leading white space is suppressed. To skip white space first, use an explicit space in the format.

Fonte: https://linux.die.net/man/3/scanf

Tente assim: scanf("%[^\n]", Cadastro.sobrenome);



Fazendo isso nem mesmo aparecia para digitar.


6. Re: Não consigo ler string com espaço [RESOLVIDO]

Lucas Rafael Barbosa Lopes
lucas7844

(usa Ubuntu)

Enviado em 08/08/2017 - 12:40h

paulo1205 escreveu:

Você tem um problema com a string de formatação. Não se deve dizer “scanf("%[^\n]s", str)”, pois isso significa que você vai tentar ler uma sequência de caracteres diferentes de '\n' seguida do caráter 's'. Se você reparar bem, essa sequência nunca vai ocorrer.

O que você provavelmente quis dizer foi “scanf("%[^\n]%*1[\n]", str)”, para ler uma para dentro de str uma string até achar um '\n', e depois suprimir o '\n' que vem logo após o fim da string lida, para que ele não seja deixado no buffer é impacte a leitura seguinte.

E o problema de ficar com a leitura vazia foi justamente não ter consumido o '\n' do final da leitura anterior. Quando essa quebra de linha aparece para uma conversão que disse que quer apenas caracteres diferentes da quebra de linha, essa leitura vai imediatamente falhar.

Quando você quiser ler linhas, no entanto, considere usar fgets() ou getline(). Mas lembre-se de que você ainda terá de garantir que removeu quebras de linhas vindas de leituras anteriores, mesmo com essas funções.


não deu certo também.


7. Re: Não consigo ler string com espaço [RESOLVIDO]

Lucas Rafael Barbosa Lopes
lucas7844

(usa Ubuntu)

Enviado em 08/08/2017 - 12:40h

GiovaneOliveira escreveu:

A função "gets"?
Ficaria assim:
gets(cadastro.nome);


O conhecimento só é adquirido quando o mesmo é compartilhado.
Giovane Oliveira
Acadêmico de Sistemas de Informação
e-mail: giovaneoliveira4@gmail.com


não consigo usar essa função no linux.


8. Re: Não consigo ler string com espaço [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 08/08/2017 - 12:46h

A função gets(), que nunca deveria ter existido, foi finalmente banida da biblioteca padrão do C na versão do padrão publicada em 2011.

Use fgets() (C padrão) ou getline() (sistemas POSIX; não sei se existe no Windows).


9. Re: Não consigo ler string com espaço [RESOLVIDO]

Giovane Oliveira
GiovaneOliveira

(usa Debian)

Enviado em 08/08/2017 - 13:38h

lucas7844 escreveu:

GiovaneOliveira escreveu:

A função "gets"?
Ficaria assim:
gets(cadastro.nome);


O conhecimento só é adquirido quando o mesmo é compartilhado.
Giovane Oliveira
Acadêmico de Sistemas de Informação
e-mail: giovaneoliveira4@gmail.com


não consigo usar essa função no linux.



Está usando o codeblocks? Se for, vc pode user o gets normalmente, vai aparecer um aviso somente, mas daí vc executa o código que ele irá funcionar. E claro, limpe o buffer caso utilizar o scanf pra coletar informações do usuário de uma variável qualquer antes do gets, se não, o gets acaba passando, ou seja, não funcionará.

O conhecimento só é adquirido quando o mesmo é compartilhado.
Giovane Oliveira
Acadêmico de Sistemas de Informação
e-mail: giovaneoliveira4@gmail.com


10. Re: Não consigo ler string com espaço [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 08/08/2017 - 14:56h

Por favor, não recomende o uso de gets(). Essa função era tão ruim que foi banida da última versão do padrão do C, em 2011.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts