www.samueldiasneto.com: Entrada de strings na linguagem C

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.