Samuel Dias Neto - sdiasneto@yahoo.com.br
Para capturar a entrada de cadeias de caracteres em C podemos usar a função scanf() com o especificador de formato %s. Exemplo:
/* scanf0.c */
#include <stdio.h>
int main(){
char nome[21];
printf("Entre com seu nome :");
scanf("%s",nome);
printf("Nome: %s.\n",nome);
return(0);
}
Execução:
$ ./scanf0 Entre com seu nome :Samuel Nome: Samuel.
Agora, digamos que o usuário resolve digitar o nome completo:
$ ./scanf0 Entre com seu nome :Samuel Dias Neto Nome: Samuel.
É ..... parece que não funcionou corretamente. Mas tem um bizú. Para que scanf() leia tudo que for digitado até encontrar um caracter de nova linha faça assim:
/* scanf1.c */
#include <stdio.h>
int main(){
char nome[21];
printf("Entre com seu nome :");
scanf("%[^\n]",nome);
printf("Nome: %s.\n",nome);
return(0);
}
Execução:
./scanf1 Entre com seu nome :Samuel Dias Neto Nome: Samuel Dias Neto.
Agora funcionou legal. A especificação "%[^\n]" diz para aceitar a entrada até que o caracter \n (nova linha) seja encontrado.
E, se o usuário desligado digitar uns espaços antes do nome:
$ ./scanf1 Entre com seu nome : Samuel Dias Neto Nome: Samuel Dias Neto.
Basta inserir um espaço antes do caracter % no especificador:
/* scanf2.c */
#include <stdio.h>
int main(){
char nome[21];
printf("Entre com seu nome :");
scanf(" %[^\n]",nome);
printf("Nome: %s.\n",nome);
return(0);
}
Execução:
$ ./scanf2 Entre com seu nome : Samuel Dias Neto Nome: Samuel Dias Neto.
Agora ficou melhor, né ???
E se o nome do cara for muito grande ???
$ ./scanf2 Entre com seu nome :Um Dois Três de Oliveira Quatro Raimundo da Silva Nome: Um Dois Três de Oliveira Quatro Raimundo da Silva. Falha de segmentação
Ops ..... falha de segmentação. Houve problema. Mais um bizú: para limitar a quantidade de caracteres da entrada basta colocar o número após o caracter % no especificador:
/* scanf3.c */
#include <stdio.h>
int main(){
char nome[21];
printf("Entre com seu nome :");
scanf(" %20[^\n]",nome);
printf("Nome: %s.\n",nome);
return(0);
}
Execução:
$ ./scanf3 Entre com seu nome :Um Dois Três de Oliveira Quatro Raimundo da Silva Nome: Um Dois Três de Oliv.
Agora não houve falha de segmentação.
Observe que ao declarar a variável para armazenar o nome ( char nome[21]) sempre colocamos um caracter a mais para armazenar o caracter nulo que encerra uma string. Observe também que não precisamos do operador "endereço de" ( & ) ao indicar a variável nome na função scanf() ( scanf(" %20[^\n]",nome) ), pois em C as strings são consideradas arrays de caracteres. E ao passar um array na verdade estamos passando o endereço do primeiro elemento do array.