paulo1205
(usa Ubuntu)
Enviado em 04/05/2016 - 14:19h
O que você quis dizer com essa string de formatação?
scanf("%s[a-z|A-Z|0-9/,.-]",ssid);
O que está dito é que você quer ler uma string e, em, seguida a exata sequência de caracteres “[a-z|A-Z|0-9/,.-]”. Se não for assim, a função
scanf () vai falhar (não sei se totalmente ou apenas parcialmente, mas seguramente vai interromper a execução antes do fim da string de formatação).
Eu desconfio que você quis dizer o seguinte:
// Aceita letras, algarismos e os símbolos “/”, “,”, “.”, “|” e “-”.
// De quebra, tira do buffer possíveis caracteres inválidos e a marca de fim de linha.
if(scanf("%[a-zA-Z0-9/,.|-]%*[^\n]%*1[\n]", ssid)==1 && strlen(ssid)>0){
/* Leitura bem sucedida. */
}
else {
/* ssid inválido */
}
Mas isso ainda está ruim. Qual o tamanho máximo de
ssid ? A leitura acima não leva isso em consideração. Melhor seria fazer o seguinte.
size_t len;
// Vale-se do fato de ssid ser um array de caracteres. Se fosse ponteiro
// dinamicamente alocado, não poderia usar sizeof desse modo.
if(
fgets(ssid, sizeof ssid, stdin)==NULL ||
(len=strlen(ssid))==0
){
/* Erro de leitura. */
}
else {
if(ssid[len-1]=='\n')
ssid[--len]='\0'; // Elimina o '\n' retido por fgets().
else if(len==(sizeof ssid)-1){
// Ocupou todo o array mas ainda não achou o '\n'.
int ch=getchar();
if(ch!='\n' && ch!=EOF){
/*
Tudo bem se o próximo caráter for '\n' ou se não houver mais
caracteres -- só que não é o caso, se a eecução cair aqui. Você
provavelmente vai querer imprimir uma mensagem de erro e
abortar (ou voltar para um ponto anterior). Além disso, pode
querer tirar os caracteres excedentes do buffer.
*/
fprintf(stderr, "Mensagem de erro.\n");
while((ch=getchar())!='\n')
if(ch==EOF){
// Erro de leitura ao tentar limpar excedentes.
abort();
}
}
}
}
// Agora faz a validação dos caracteres da string.
if(
strspn(
ssid,
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789|/,.-"
)!=len
){
/* Caracteres inválidos no ssid. */
}
}
Outra forma seria a seguinte.
char ssid_fmt_str[80];
int a, b, c, n;
snprintf(
ssid_fmt_str, sizeof ssid_fmt_str,
"%%%zd[A-Za-z0-9/,.|-]%%n%%*[^\n]%%n%%*1[\n]%%n", (sizeof ssid)-1
);
a=b=c=0;
n=scanf(ssid_fmt_str, ssid);
if(n==EOF){
/ * Erro de leitura. */
}
else if(n!=1 || a==0 || b>a || c<=b){
/* Valor digitado inválido. */
// Se quiser tentar de novo, é bom limpar o buffer antes.
if(scanf("%*[^\n]%*1[\n]")==EOF) // Mas se der erro de leitura...
abort(); // ... talvez seja melhor abortar.
}
else {
/* Aqui você tem um ssid válido. */
}