{"id":711,"date":"2017-11-10T22:17:38","date_gmt":"2017-11-11T00:17:38","guid":{"rendered":"http:\/\/www.galirows.com.br\/meublog\/programacao\/?p=711"},"modified":"2021-06-18T15:04:46","modified_gmt":"2021-06-18T18:04:46","slug":"ler-duas-letras-seguidas-no-c","status":"publish","type":"post","link":"http:\/\/www.galirows.com.br\/meublog\/programacao\/ler-duas-letras-seguidas-no-c\/","title":{"rendered":"Ler duas letras seguidas no C"},"content":{"rendered":"\n<p>Se tem uma coisa que sempre me incomoda na programa\u00e7\u00e3o em linguagem C \u00e9 a leitura de caracteres.<\/p>\n\n\n\n<p>Veja o c\u00f3digo a seguir, ele parece correto. Na teoria voc\u00ea faz a leitura de um n\u00famero de depois de uma letra e depois mostra esses dados. Na pr\u00e1tica, somente o n\u00famero lido est\u00e1 dispon\u00edvel. Isso porque o valor que acabou sendo lido para a vari\u00e1vel de <em>char<\/em> foi o que indica uma nova linha (do enter que voc\u00ea deu ao entrar o n\u00famero.<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c decode:true\"><code lang=\"c\" class=\"language-c\">int main(void) {\n\tchar a;\n\tint  x;\n\tscanf(\"%d\", &amp;x);\n\tscanf(\"%c\", &amp;a);\n\tprintf(\"\\n: %i : %c : \", x, a);\n\treturn 0;\n}<\/code><\/pre>\n\n\n\n<p>Sabendo do motivo, voc\u00ea pode buscar solu\u00e7\u00f5es, como a apresentada a seguir. Nessa solu\u00e7\u00e3o eu primeiro fiz a leitura da letra e depois do n\u00famero. Isso resolve.<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c decode:true\"><code lang=\"c\" class=\"language-c\">int main(void) {\n\tchar a;\n\tint  x;\n\tscanf(\"%c\", &amp;a);\n\tscanf(\"%d\", &amp;x);\n\tprintf(\"\\n: %i : %c : \", x, a);\n\treturn 0;\n}<\/code><\/pre>\n\n\n\n<p>Outra forma que funciona \u00e9 fazer a leitura das entradas em um \u00fanico comando, como mostro no c\u00f3digo abaixo.<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c decode:true\"><code lang=\"c\" class=\"language-c\">int main(void) {\n\tchar a;\n\tint  x;\n\tscanf(\"%d %c\", &amp;x, &amp;a);\n\tprintf(\"\\n: %i : %c : \", x, a);\n\treturn 0;\n}<\/code><\/pre>\n\n\n\n<p>Essa segunda forma inclusive, funciona quando precisamos ler v\u00e1rias letras seguidas, como no c\u00f3digo a seguir, onde mostra a leitura de um n\u00famero seguido de duas letras.<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c decode:true\"><code lang=\"c\" class=\"language-c\">int main(void) {\n\tchar a, b;\n\tint  x;\n\tscanf(\"%d %c %c\", &amp;x, &amp;a, &amp;b);\n\tprintf(\"\\n: %i : %c : %c : \", x, a, b);\n\treturn 0;\n}<\/code><\/pre>\n\n\n\n<p>Mas nem sempre \u00e9 poss\u00edvel utilizar o scanf com todas as vari\u00e1veis de uma vez. Muitas vezes \u00e9 preciso fazer um printf para indicar ao usu\u00e1rio, antes de cada scanf, o que ele precisa fornecer de dados. Mas isso ainda tem solu\u00e7\u00e3o.<\/p>\n\n\n\n<p>Como eu disse, o problema do scanf de um caractere \u00e9 que ele acaba lendo o caractere de nova linha. Uma gambiarra que pode ser utilizada \u00e9 uma leitura falsa para pegar esse caractere que n\u00e3o se tem interesse. Veja que fa\u00e7o a leitura repetida no scanf. A primeira pega o caractere de nova linha e a segunda pega a letra efetivamente.<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c decode:true\"><code lang=\"c\" class=\"language-c\">#include &lt;stdio.h&gt;\n#include &lt;string.h&gt;\n\nint main(void) {\n\tchar a, b;\n\tint  x;\n\tscanf(\"%d\", &amp;x);\n\tscanf(\"%c\", &amp;a);\n\tscanf(\"%c\", &amp;a);\n\tscanf(\"%c\", &amp;b);\n\tscanf(\"%c\", &amp;b);\n\tprintf(\"\\n: %i : %c : %c : \", x, a, b);\n\treturn 0;\n}\n<\/code><\/pre>\n\n\n\n<p>Existem outras formas de fazer a leitura de caracteres, mas eu ilustrei algumas b\u00e1sicas poss\u00edveis. Muitos recomendam o uso da fun\u00e7\u00e3o fflush(stdin), mas ela n\u00e3o funciona sempre.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Se tem uma coisa que sempre me incomoda na programa\u00e7\u00e3o em linguagem C \u00e9 a leitura de caracteres. Veja o c\u00f3digo a seguir, ele parece correto. Na teoria voc\u00ea faz a leitura de um n\u00famero de depois de uma letra e depois mostra esses dados. Na pr\u00e1tica, somente o n\u00famero lido est\u00e1 dispon\u00edvel. Isso porque [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[3],"tags":[],"class_list":["post-711","post","type-post","status-publish","format-standard","hentry","category-c"],"aioseo_notices":[],"amp_enabled":true,"_links":{"self":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/711","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/comments?post=711"}],"version-history":[{"count":3,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/711\/revisions"}],"predecessor-version":[{"id":1049,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/711\/revisions\/1049"}],"wp:attachment":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/media?parent=711"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/categories?post=711"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/tags?post=711"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}