Um dos mitos que existem sobre o C é que não é possível ler strings que tenham espaçoes e outros caractéres especiais com o scanf(). Este artigo pretende destruir este mito.
Existem as seguintes sequências de controlo para o scanf() e printf():
| Caracter de controlo | Descrição |
|---|---|
| %c | um caracter (exemplo: 'a') |
| %i | um número inteiro |
| %d | um número inteiro em decimal (exemplo: 1) |
| %e ou %f ou %g | um float (exemplo: 5.9785) |
| %o | um número em octal |
| %s | uma simples string |
| %x | um número em hexadecimal |
| %p | um ponteiro |
| %n | um inteiro equivalente ao número de caracteres escritos até ali naquela iteração |
| %u | um unsigned integer |
| %[] | um conjunto de caracteres |
| %% | o símbolo % |
Como se pode ver, existe uma sequeência de controlo mais flexível que o %s: o %[].
Graças a esta sequência de controlo, podemos escolher o que queremos ler. Dentro dos parenteses escrevemos os caracteres permitidos (ex: %[aeiou]) ou negados (ex: %[^aeiou]). Para lermos uma string podemos usar, por exemplo, %[^\n], que vai ler todos os caracteres até encontrar o \n neste caso (o \n não é incluído na string). A sintaxe deste especificador funciona de modo semelhante às expressões regulares POSIX.
Se quisermos limitar o tamanho da string, podemos limitá-la antes do conjunto de caracteres a ler. Neste exemplo, vamos ler uma string com 60 caracteres no máximo: %60[^\n].
Algoritmo de INPUT de dados em C:
/* Ler os dados */ scanf("%[^\n]", str); /* Limpar o buffer */ scanf("%*[^\n]"); scanf("%*c"); /* Voltar ao passo 1. */
O %n funciona do seguinte modo:
#include <stdio.h> int main() { int n, tmp; printf("Hello%n\n", &n); tmp = n; printf("Nº de chars escritos até agora: %d\n", tmp); printf("World!%n\n",&n); tmp += n; printf("Nº de chars escritos até agora: %d\n", tmp); return 0; }
Resultado:
Hello Nº de chars escritos até agora: 5 World! Nº de chars escritos até agora: 11