O que significa espaço em scanf?

#include  int main(int argc, char* argv[]) { char c; scanf(" %c", &c); printf("%c\n", c); return 0; } [root@test]# ./scanf a a [root@test]# ./scanf h h 

Parece sempre combinar se o espaço existe, por quê?

Espaço em branco (como espaços em branco, tabulações ou novas linhas) na string de formato corresponde a qualquer quantidade de espaço em branco, incluindo nenhum , na input.

http://www.manpagez.com/man/3/scanf/

O espaço no formato scanf significa “pular todos os espaços em branco” da posição atual em. Como a maioria dos especificadores de formato scanf já irá pular todos os espaços em branco antes de tentar ler qualquer coisa, o espaço não é usado no formato scanf na maioria das vezes. No entanto, quando você estiver usando um especificador de formato que não ignore espaços em branco, include espaço no formato quando necessário (para forçar o salto) pode fazer sentido.

Os especificadores que não ignoram os espaços em branco são c [ e n . Então, especificar um espaço na frente de um desses especificadores faz a diferença. Caso contrário, não faz diferença alguma. Em seu exemplo específico, o espaço em branco é ignorado especificamente porque você usou um espaço no formato scanf (desde que você esteja usando %c ). Tente remover o espaço e veja o que acontece.

Um caractere de espaço em branco na string de formato ignorará 0 ou mais caracteres de espaço em branco da input, até o primeiro caractere que não seja espaço em branco.

A documentação do scanf diz:

Uma diretiva composta de um ou mais caracteres de espaço em branco deve ser executada lendo a input até que nenhuma outra input válida possa ser lida, ou até o primeiro byte que não seja um caractere de espaço em branco, que permanece não lido.

E também

Os caracteres de espaço em branco de input (conforme especificado por isspace) devem ser ignorados, a menos que a especificação de conversão inclua um especificador de conversão [, c, C ou n.

O que significa que o espaço na sua string de formato é necessário. Se você fosse ler um inteiro, no entanto, o espaço teria sido redundante:

 /* equivalent statements */ scanf(" %d %d %d", &v1, &v2, &v3); scanf("%d%d%d", &v1, &v2, &v3); 

O espaço significa apenas que um espaço é aceito como input. Você pode querer ler este tópico relacionado sobre os perigos de usar scanf ao invés de fgets.

Como você permite que os espaços sejam typescripts usando o scanf?

O% c não pulará o char do espaço em branco como os especificadores de formato numérico. Então, se você usar:

 #include int main(int argc, char* argv[]){ char c; scanf("%c", &c); printf("%c\n", c); scanf("%c", &c); // Try running with and without space printf("%c\n", c); return 0; } 

É muito provável que o caractere de espaço em branco anterior no buffer de input seja obtido no segundo scanf, e você não terá a chance de digitar. O espaço antes de% c fará com que scanf ignore qualquer caractere de espaço em branco no buffer de input para que você possa inserir sua input corretamente. Às vezes, para obter o mesmo efeito, as pessoas escrevem:

 fflush(stdin); scanf("%c" &c); 

Mas isso é considerado muito ruim programação como C Standard especifica o comportamento de fflush (stdin) é indefinido. Por isso, sempre use espaço na string de formatação, a menos que você tenha um motivo específico para capturar os espaços em branco também.