<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" ><channel><title>Shakaran &#187; Lenguaje C</title> <atom:link href="http://shakaran.net/blog/category/Lenguaje%20C/feed/" rel="self" type="application/rss+xml" /><link>http://shakaran.net/blog</link> <description>Blog de un estudiante de ingeniería informática y sysadmin</description> <lastBuildDate>Sun, 29 Aug 2010 04:21:39 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <image><link>http://shakaran.net/blog</link> <url>http://www.shakaran.net/blog/wp-content/favicon.png</url><title>Shakaran</title> </image> <item><title>Palíndromo en C desde un fichero</title><link>http://shakaran.net/blog/2009/02/palindromo-en-c-desde-un-fichero/</link> <comments>http://shakaran.net/blog/2009/02/palindromo-en-c-desde-un-fichero/#comments</comments> <pubDate>Thu, 05 Feb 2009 20:52:44 +0000</pubDate> <dc:creator>shakaran</dc:creator> <category><![CDATA[Lenguaje C]]></category> <category><![CDATA[Open Source]]></category> <category><![CDATA[c]]></category> <category><![CDATA[elegancia]]></category> <category><![CDATA[fichero]]></category> <category><![CDATA[lenguaje]]></category> <category><![CDATA[palindromo]]></category> <category><![CDATA[programa]]></category><guid isPermaLink="false">http://shakaran.net/blog/?p=257</guid> <description><![CDATA[jQuery(document).ready(function($) { window.setTimeout('loadDigg_257()',5000);window.setTimeout('loadReddit_257()',5000);window.setTimeout('loadGBuzz_257()',5000);window.setTimeout('loadDzone_257()',5000);window.setTimeout('loadTwitter_257()',5000);window.setTimeout('loadFBShare_257()',5000);window.setTimeout('loadFBShareMe_257()',5000);window.setTimeout('loadFBLike_257()',5000);window.setTimeout('loadDelicious_257()',5000);$('.delicious-normal-img,.delicious-compact-img').hide(); }); function loadDigg_257(){ jQuery(document).ready(function($) { $('.dd-digg-257').remove();$('.DD_DIGG_AJAX_257').attr('href','http://digg.com/submit?url=http://shakaran.net/blog/2009/02/palindromo-en-c-desde-un-fichero/&#38;title=Pal%C3%ADndromo+en+C+desde+un+fichero');$.getScript('http://widgets.digg.com/buttons.js'); }); } function loadReddit_257(){ jQuery(document).ready(function($) { $('.dd-reddit-257').remove();$('.DD_REDDIT_AJAX_257').attr('width','51');$('.DD_REDDIT_AJAX_257').attr('height','69');$('.DD_REDDIT_AJAX_257').attr('src','http://www.reddit.com/static/button/button2.html?width=51&#38;url=http://shakaran.net/blog/2009/02/palindromo-en-c-desde-un-fichero/&#38;title=Pal%C3%ADndromo+en+C+desde+un+fichero&#38;newwindow=1'); }); } function loadGBuzz_257(){ jQuery(document).ready(function($) { $('.dd-gbuzz-257').remove();$.getScript('http://www.google.com/buzz/api/button.js'); }); } function loadDzone_257(){ jQuery(document).ready(function($) { $('.dd-dzone-257').remove();$('.DD_DZONE_AJAX_257').attr('width','52');$('.DD_DZONE_AJAX_257').attr('height','68');$('.DD_DZONE_AJAX_257').attr('src','http://widgets.dzone.com/links/widgets/zoneit.html?url=http://shakaran.net/blog/2009/02/palindromo-en-c-desde-un-fichero/&#038;title=Pal%C3%ADndromo+en+C+desde+un+fichero&#038;t=1'); }); } function loadTwitter_257(){ jQuery(document).ready(function($) { $('.dd-twitter-257').remove();$('.DD_TWITTER_AJAX_257').attr('width','50');$('.DD_TWITTER_AJAX_257').attr('height','61');$('.DD_TWITTER_AJAX_257').attr('src','http://api.tweetmeme.com/button.js?url=VOTE_URL&#038;source=VOTE_SOURCE&#038;style=normal&#038;service=VOTE_SERVICE_NAME&#038;service_api=VOTE_SERVICE_API'); }); } function loadFBShare_257(){ jQuery(document).ready(function($) { $('.dd-fbshare-257').remove(); $.getScript('http://static.ak.fbcdn.net/connect.php/js/FB.Share'); }); } function loadFBShareMe_257(){ jQuery(document).ready(function($) { $('.dd-fbshareme-257').remove();$('.DD_FBSHAREME_AJAX_257').attr('width','53');$('.DD_FBSHAREME_AJAX_257').attr('height','69');$('.DD_FBSHAREME_AJAX_257').attr('src','http://widgets.fbshare.me/files/fbshare.php?url=http://shakaran.net/blog/2009/02/palindromo-en-c-desde-un-fichero/&#038;size=large'); }); } function [...]<br /><div><img src="http://shakaran.net/blog/wp-content/plugins/gd-star-rating/gfx.php?value=5.5" /></div><div>Rating: 5.5/<strong>10</strong> (2 votes cast)</div><br />Entradas relacionadas:<ol><li><a href='http://shakaran.net/blog/2008/07/cumplir-estandar-w3c-con-target-blank-utilizando-mootools/' rel='bookmark' title='Permanent Link: Cumplir estandar W3C con target=&#8221;_blank&#8221; utilizando Mootools'>Cumplir estandar W3C con target=&#8221;_blank&#8221; utilizando Mootools</a></li><li><a href='http://shakaran.net/blog/2008/11/glsl-basico-desde-cero/' rel='bookmark' title='Permanent Link: GLSL básico desde cero'>GLSL básico desde cero</a></li></ol>]]></description> <content:encoded><![CDATA[<div class="wpbuzzer_button" style="float: right"><a title="Post on Google Buzz" class="google-buzz-button" href="http://www.google.com/buzz/post" data-button-style="normal-button" data-url="http://shakaran.net/blog/2009/02/palindromo-en-c-desde-un-fichero/" data-imageurl=""></a><script type="text/javascript" src="http://www.google.com/buzz/api/button.js"></script></div><script type="text/javascript">jQuery(document).ready(function($){window.setTimeout('loadDigg_257()',5000);window.setTimeout('loadReddit_257()',5000);window.setTimeout('loadGBuzz_257()',5000);window.setTimeout('loadDzone_257()',5000);window.setTimeout('loadTwitter_257()',5000);window.setTimeout('loadFBShare_257()',5000);window.setTimeout('loadFBShareMe_257()',5000);window.setTimeout('loadFBLike_257()',5000);window.setTimeout('loadDelicious_257()',5000);$('.delicious-normal-img,.delicious-compact-img').hide();});</script><script type="text/javascript">/*<![CDATA[*/function loadDigg_257(){jQuery(document).ready(function($){$('.dd-digg-257').remove();$('.DD_DIGG_AJAX_257').attr('href','http://digg.com/submit?url=http://shakaran.net/blog/2009/02/palindromo-en-c-desde-un-fichero/&amp;title=Pal%C3%ADndromo+en+C+desde+un+fichero');$.getScript('http://widgets.digg.com/buttons.js');});}function loadReddit_257(){jQuery(document).ready(function($){$('.dd-reddit-257').remove();$('.DD_REDDIT_AJAX_257').attr('width','51');$('.DD_REDDIT_AJAX_257').attr('height','69');$('.DD_REDDIT_AJAX_257').attr('src','http://www.reddit.com/static/button/button2.html?width=51&amp;url=http://shakaran.net/blog/2009/02/palindromo-en-c-desde-un-fichero/&amp;title=Pal%C3%ADndromo+en+C+desde+un+fichero&amp;newwindow=1');});}function loadGBuzz_257(){jQuery(document).ready(function($){$('.dd-gbuzz-257').remove();$.getScript('http://www.google.com/buzz/api/button.js');});}function loadDzone_257(){jQuery(document).ready(function($){$('.dd-dzone-257').remove();$('.DD_DZONE_AJAX_257').attr('width','52');$('.DD_DZONE_AJAX_257').attr('height','68');$('.DD_DZONE_AJAX_257').attr('src','http://widgets.dzone.com/links/widgets/zoneit.html?url=http://shakaran.net/blog/2009/02/palindromo-en-c-desde-un-fichero/&title=Pal%C3%ADndromo+en+C+desde+un+fichero&t=1');});}function loadTwitter_257(){jQuery(document).ready(function($){$('.dd-twitter-257').remove();$('.DD_TWITTER_AJAX_257').attr('width','50');$('.DD_TWITTER_AJAX_257').attr('height','61');$('.DD_TWITTER_AJAX_257').attr('src','http://api.tweetmeme.com/button.js?url=VOTE_URL&source=VOTE_SOURCE&style=normal&service=VOTE_SERVICE_NAME&service_api=VOTE_SERVICE_API');});}function loadFBShare_257(){jQuery(document).ready(function($){$('.dd-fbshare-257').remove();$.getScript('http://static.ak.fbcdn.net/connect.php/js/FB.Share');});}function loadFBShareMe_257(){jQuery(document).ready(function($){$('.dd-fbshareme-257').remove();$('.DD_FBSHAREME_AJAX_257').attr('width','53');$('.DD_FBSHAREME_AJAX_257').attr('height','69');$('.DD_FBSHAREME_AJAX_257').attr('src','http://widgets.fbshare.me/files/fbshare.php?url=http://shakaran.net/blog/2009/02/palindromo-en-c-desde-un-fichero/&size=large');});}function loadFBLike_257(){jQuery(document).ready(function($){$('.dd-fblike-257').remove();$('.DD_FBLIKE_AJAX_257').attr('width','450');$('.DD_FBLIKE_AJAX_257').attr('height','25');$('.DD_FBLIKE_AJAX_257').attr('src','http://www.facebook.com/plugins/like.php?href=http://shakaran.net/blog/2009/02/palindromo-en-c-desde-un-fichero/&amp;show_faces=false');});}function loadDelicious_257(){jQuery(document).ready(function($){$('.dd-delicious-257').remove();$('.delicious-normal-img,.delicious-compact-img').show();$.getJSON('http://feeds.delicious.com/v2/json/urlinfo/data?url=http://shakaran.net/blog/2009/02/palindromo-en-c-desde-un-fichero/&amp;callback=?',function(data){var msg='';var count=0;if(data.length>0){count=data[0].total_posts;if(count==0){msg='Save';}else if(count==1){msg='1 save';}else{msg=count+' saves'}}else{msg='Save';}$('#DD_DELICIOUS_AJAX_257').text(msg);});});}/*]]>*/</script><h3><span style="color: #800000;">Introducción</span></h3><p>Estos días he tenido que hacer un <strong>pequeño ejemplo</strong> de un programa en C, aparentemente sencillo, pero del que no he encontrado buenas soluciones<a title="Soluciones palindromo en C en español" href="http://www.google.es/search?q=palindromo+C" target="_blank"> en Google</a>, ni siguiera en <a title="Soluciones palindromo en C en ingles" href="http://www.google.com/webhp?hl=en&amp;q=palindrome+C#hl=en&amp;q=palindrome+C&amp;btnG=Google+Search&amp;aq=f&amp;oq=undefined&amp;fp=1">otros idiomas</a> más dados.</p><p>Casi todos los ejemplos que veía por internet eran <strong>poco elegantes</strong>, no cuidaban el <strong>tratamiento de errores</strong> y además todos pedían la <strong>entrada de datos por línea de órdenes</strong>. Asi que me ha parecido útil ponerlo en el blog, para que gente que se encuentre con el problema en un futuro, tenga una buena referencia o al menos aproximada a su solución.</p><h3><span style="color: #800000;">Descripción del problema</span></h3><p>El problema consiste en <strong>crear un programa en C</strong> que pida el nombre de un archivo de texto y devuelva el número  y el palíndromo de todos los <strong>posibles palíndromos</strong> encontrados en dicho archivo.</p><p>Un <strong>palíndromo</strong> segun <a class="wpGallery" title="Wikipedia: palíndromo" href="http://es.wikipedia.org/wiki/Algunos_palíndromos">Wikipedia</a> es:</p><blockquote><p><em>Una palabra, número o frase que se lee igual hacia adelante que hacia atrás. </em></p></blockquote><p>Por ejemplo algunas palabras: <em>ala, bob, solos, reconocer, &#8230;</em></p><p>Y alguna frases como:</p><p>&#8220;<em>Dabale arroz a la zorra el abad</em>&#8221;</p><p>En nuestro caso <strong>por simplicidad</strong> y caso común detectaremos solo las palabras y no frases o textos enteros, ya que si no esto podría complicarse hasta un nivel mayor, aunque tampoco sería demasiado complicado.</p><h3><span style="color: #800000;">Resolución del problema</span></h3><p>Supongamos que tenemos un <strong>fichero de ejemplo</strong> con algunos palíndromos como el siguiente:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Descargar <a href="http://shakaran.net/blog/wp-content/plugins/wp-codebox/wp-codebox.php?p=257&amp;download=ejemplo.txt">ejemplo.txt</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p2578"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p257code8"><pre class="text" style="font-family:monospace;">Este es un archivo de prueba
que contiene palíndromos como
pueden ser: ala anilina reconocer solos otto bob
pero por ejemplo no son palindromos
solas ola</pre></td></tr></table></div><p>El siguiente programa, <strong>detectara los palíndromos</strong> según nuestros propósitos (lo explico más detalladamente después):</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Descargar <a href="http://shakaran.net/blog/wp-content/plugins/wp-codebox/wp-codebox.php?p=257&amp;download=palin.c">palin.c</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p2579"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
</pre></td><td class="code" id="p257code9"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt; stdio.h&gt;;</span>
<span style="color: #339933;">#include &lt; stdlib.h&gt;;</span>
<span style="color: #339933;">#include &lt; string.h&gt;;</span>
&nbsp;
<span style="color: #993333;">int</span> searchPalin<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>cad<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> d <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span> strlen<span style="color: #009900;">&#40;</span>cad<span style="color: #009900;">&#41;</span><span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> palin<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>palin <span style="color: #339933;">==</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">&lt;</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span>strlen<span style="color: #009900;">&#40;</span>cad<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>cad<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">!=</span> cad<span style="color: #009900;">&#91;</span>d<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> palin<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #009900;">&#123;</span>
            i<span style="color: #339933;">++;</span>
            d<span style="color: #339933;">--;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> palin<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span><span style="color: #339933;">**</span> argv<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>argc <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        fprintf<span style="color: #009900;">&#40;</span>stderr<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;palin: opción inválida<span style="color: #000099; font-weight: bold;">\n</span>El primer argumento debe ser un nombre de archivo.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>namefile<span style="color: #339933;">=</span>argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    FILE <span style="color: #339933;">*</span>fd<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>fd<span style="color: #339933;">=</span>fopen<span style="color: #009900;">&#40;</span>namefile<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;r&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        fprintf<span style="color: #009900;">&#40;</span>stderr<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;palin: Error al abrir el archivo.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Buscando palíndromos en archivo: %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>namefile<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        fseek<span style="color: #009900;">&#40;</span>fd<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> SEEK_END<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #993333;">long</span> length <span style="color: #339933;">=</span> ftell<span style="color: #009900;">&#40;</span>fd<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        fseek<span style="color: #009900;">&#40;</span>fd<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> SEEK_SET<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>w<span style="color: #339933;">;</span>
        w <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> malloc<span style="color: #009900;">&#40;</span>length<span style="color: #339933;">*</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span>j<span style="color: #339933;">,</span>p<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
        fread<span style="color: #009900;">&#40;</span>w<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> length<span style="color: #339933;">,</span> fd<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        fclose<span style="color: #009900;">&#40;</span>fd<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>aux<span style="color: #339933;">;</span>
        aux <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> malloc<span style="color: #009900;">&#40;</span>strlen<span style="color: #009900;">&#40;</span>w<span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>j<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span>strlen<span style="color: #009900;">&#40;</span>w<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>w<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #ff0000;">' '</span> <span style="color: #339933;">||</span> w<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">==</span><span style="color: #ff0000;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                aux<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'<span style="color: #006699; font-weight: bold;">\0</span>'</span><span style="color: #339933;">;</span>
                j<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>searchPalin<span style="color: #009900;">&#40;</span>aux<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d. %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,++</span>p<span style="color: #339933;">,</span>aux<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #b1b100;">else</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>w<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">!=</span> <span style="color: #ff0000;">'<span style="color: #000099; font-weight: bold;">\t</span>'</span> <span style="color: #339933;">&amp;&amp;</span> w<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">!=</span> <span style="color: #ff0000;">' '</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#123;</span>
                    aux<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> w<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                    j<span style="color: #339933;">++;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div><p>Bien pasemos a la <strong>explicación detallada</strong>:</p><p>Las tres primeras lineas incluyen en las<strong> bibliotecas necesarias</strong> para el funcionamiento del programa, la de entrada/salida estandar, la biblioteca estandar y la biblioteca de cadenas (útil para estos propósitos).</p><p>La función searchPalin es la que puedes encontrar <strong>en la mayoría de los sitios de internet</strong>, se encarga de contar los caracteres de la cadena e ir viendo desde el principio al final si van coincidiendo por el principio y por el final. Si es así retorna un valor booleano verdadero (líneas 5 a 19).</p><p>En la función main primero comprobamos que hemos recibido un <strong>número correcto de argumentos</strong>, al menos los necesarios, ya que más de los estrictos, serán ignorados (líneas 23 a 27).</p><p>Como segunda comprobación tenemos que <strong>asegurarnos que el parámetro</strong> del nombre de fichero dado, existe y se puede abrir para lectura, si es así ya podemos procesar el archivo en busca de palíndromos (líneas 29 a 36).</p><p>Por comodidad para <strong>realizar la lectura del archivo</strong> utilizamos la función fread() (línea 48), por lo que será necesario saber la longitud del fichero. La longitud de un fichero no es difícil de calcular, pero hay que tener un aspecto en cuenta.</p><p>La función que tenemos disponible para e<strong>l cálculo de la longitud de un fichero</strong> es ftell(), pero dicha función retorna el indicador de posición de fichero, que al comenzar la lectura será 0, luego, necesitamos posicionarnos al final del fichero, después llamar a ftell() y por último volver al principio del fichero para empezar a leer caracteres mediante fread(). Para <strong>posicionarnos</strong> al principio y al final utilizamos fseek() consiguiendo nuestro propósito (lineas 41 a 43) .</p><p>Después cerraremos el archivo con fclose() (línea 49), ya que habremos leído todos los caracteres y los habremos almacenado en una variable llamada w, con la <strong>peculiaridad</strong>, de que se hace una <strong>reserva dinámica de memoria</strong> con la cantidad exacta de caracteres del archivo, aprovechando que ya habíamos calculado la longitud del archivo (línea 44 y45), por lo que no nos limitamos a una cantidad en un archivo (como hacen otras posibles implementaciones).</p><p>También necesitaremos una<strong> cadena auxiliar</strong> (aux) en la que reservaremos la cantidad de carácteres que tenga w (línea 51 y 52).</p><p>Posteriormente procesaremos nuestra cadena y si leemos un carácter normal que no sea un espacio en blanco o un tabulador, lo almacenaremos en nuestra cadena auxiliar (líneas 61 a 68). Si por el contrario encontramos un salto de línea o un espacio en blanco (lineas 55 a 60) , entonces sera una palabra distinta, por lo que <strong>procesaremos el contenido</strong> que tengamos en aux, ademas de añadir el carácter &#8216;\0&#8242; de final de cadena (línea 57). Esto último es importante, ya que si no añadimos ese carácter no se interpretara bien la cadena al no estar completa y ser una sucesión de caracteres (peculiaridades de C).</p><p>Llamaremos a la función searchPalin para que nos verifique si la cadena aux es un palindromo y si es, mostraremos el <strong>número de palindromo</strong> y el palíndromo en sí.</p><h3><span style="color: #800000;">Compilación y ejecución</span></h3><p>Para compilar el archivo, se puede hacer a pelo, o bien podemos utilizar un makefile (mucho más cómodo) como el siguiente: </pre><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Descargar <a href="http://shakaran.net/blog/wp-content/plugins/wp-codebox/wp-codebox.php?p=257&amp;download=Makefile">Makefile</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p25710"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code" id="p257code10"><pre class="makefile" style="font-family:monospace;">BINARY = palin
CFLAGS = -o
CC = gcc
RM = rm
&nbsp;
all:
    @echo Compilando...
 $(CC) $(BINARY).c $(CFLAGS) $(BINARY)
   @echo Hecho.
&nbsp;
clean:
  @echo Limpiando...
  $(RM) -f *.o *~
 @echo Hecho.</pre></td></tr></table></div><p>Para compilar escribimos:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Descargar <a href="http://shakaran.net/blog/wp-content/plugins/wp-codebox/wp-codebox.php?p=257&amp;download=compilar.txt">compilar.txt</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p25711"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p257code11"><pre class="shell" style="font-family:monospace;">$ make</pre></td></tr></table></div><p>Para ejecutar el binario con el fichero de ejemplo.txt:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Descargar <a href="http://shakaran.net/blog/wp-content/plugins/wp-codebox/wp-codebox.php?p=257&amp;download=ejecutar.txt">ejecutar.txt</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p25712"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p257code12"><pre class="shell" style="font-family:monospace;">$ ./palin ejemplo.txt</pre></td></tr></table></div><p>Y debe dar una salida como:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Descargar <a href="http://shakaran.net/blog/wp-content/plugins/wp-codebox/wp-codebox.php?p=257&amp;download=salida.txt">salida.txt</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p25713"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p257code13"><pre class="text" style="font-family:monospace;">Buscando palíndromos en archivo: ejemplo_old.txt
1. ala
2. anilina
3. reconocer
4. solos
5. otto
6. bob</pre></td></tr></table></div><p>Para limpiar la compilación:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Descargar <a href="http://shakaran.net/blog/wp-content/plugins/wp-codebox/wp-codebox.php?p=257&amp;download=limpiar.txt">limpiar.txt</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p25714"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p257code14"><pre class="shell" style="font-family:monospace;">$ make clean</pre></td></tr></table></div><p>Y eso es todo, no es muy complicado, pero requiere varios detalles en los que se debe <strong>prestar atención</strong>.</p><p>Cualquier sugerencia de <strong>mejora o comentario</strong> adicional es bienvenido.</p><p>Happy coding!</p><div class='dd_post_share'><div class='dd_buttons'><div class='dd_button'><div class='dd-digg-ajax-load dd-digg-257'></div><a class='DiggThisButton DD_DIGG_AJAX_257 DiggCompact'></a></div><div class='dd_button'><div class='dd-reddit-ajax-load dd-reddit-257'></div><iframe class='DD_REDDIT_AJAX_257' src='#' height='0' width='0' scrolling='no' frameborder='0'></iframe></div><div class='dd_button'><div class='dd-dzone-ajax-load dd-dzone-257'></div><iframe class='DD_DZONE_AJAX_257' src='#' height='0' width='0' scrolling='no' frameborder='0'></iframe></div><div class='dd_button'><div class='dd-fbshare-ajax-load dd-fbshare-257'></div><a class='DD_FBSHARE_AJAX_257' name='fb_share' type='button_count' share_url='http://shakaran.net/blog/2009/02/palindromo-en-c-desde-un-fichero/' href='http://www.facebook.com/sharer.php'></a></div><div class='dd_button'><div class='dd-fblike-ajax-load dd-fblike-257'></div><iframe class="DD_FBLIKE_AJAX_257" src='#' height='0' width='0' scrolling='no' frameborder='0' allowTransparency='true'></iframe></div><div class='dd_button'><div class='dd-delicious-ajax-load dd-delicious-257'></div><a href='http://delicious.com/save' onclick="window.open('http://delicious.com/save?v=5&amp;noui&amp;jump=close&amp;url='+encodeURIComponent('http://shakaran.net/blog/2009/02/palindromo-en-c-desde-un-fichero/')+'&amp;title='+encodeURIComponent('Pal%C3%ADndromo+en+C+desde+un+fichero'),'delicious', 'toolbar=no,width=550,height=550'); return false;"><div class='delicious-compact-img'><img src='http://shakaran.net/blog/wp-content/plugins/digg-digg/image/delicious-compact.png' alt='Delicious' /></div><span id='DD_DELICIOUS_AJAX_257'></span></a></div><div class='dd_button'><script src='http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://shakaran.net/blog/2009/02/palindromo-en-c-desde-un-fichero/'></script></div></div></div><div style='clear:both'></div><br /><div><img src="http://shakaran.net/blog/wp-content/plugins/gd-star-rating/gfx.php?value=5.5" /></div><div>Rating: 5.5/<strong>10</strong> (2 votes cast)</div><br /><div class="sociable"><div class="sociable_tagline"> <strong>Comparte, descargalo en pdf, imprimelo o enviaselo a un amigo!</strong></div><ul><li class="sociablefirst"><a rel="nofollow"  target="_blank" href="http://www.printfriendly.com/print?url=http%3A%2F%2Fshakaran.net%2Fblog%2F2009%2F02%2Fpalindromo-en-c-desde-un-fichero%2F&amp;partner=sociable" title="Print"><img src="http://shakaran.net/blog/wp-content/plugins/sociable/images/printfriendly.png" title="Print" alt="Print" class="sociable-hovers" /></a></li><li><a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fshakaran.net%2Fblog%2F2009%2F02%2Fpalindromo-en-c-desde-un-fichero%2F&amp;title=Pal%C3%ADndromo%20en%20C%20desde%20un%20fichero&amp;bodytext=Introducci%C3%B3n%0D%0AEstos%20d%C3%ADas%20he%20tenido%20que%20hacer%20un%20peque%C3%B1o%20ejemplo%20de%20un%20programa%20en%20C%2C%20aparentemente%20sencillo%2C%20pero%20del%20que%20no%20he%20encontrado%20buenas%20soluciones%20en%20Google%2C%20ni%20siguiera%20en%20otros%20idiomas%20m%C3%A1s%20dados.%0D%0A%0D%0ACasi%20todos%20los%20ejemplos%20que%20ve%C3%ADa%20p" title="Digg"><img src="http://shakaran.net/blog/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a></li><li><a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fshakaran.net%2Fblog%2F2009%2F02%2Fpalindromo-en-c-desde-un-fichero%2F&amp;title=Pal%C3%ADndromo%20en%20C%20desde%20un%20fichero&amp;notes=Introducci%C3%B3n%0D%0AEstos%20d%C3%ADas%20he%20tenido%20que%20hacer%20un%20peque%C3%B1o%20ejemplo%20de%20un%20programa%20en%20C%2C%20aparentemente%20sencillo%2C%20pero%20del%20que%20no%20he%20encontrado%20buenas%20soluciones%20en%20Google%2C%20ni%20siguiera%20en%20otros%20idiomas%20m%C3%A1s%20dados.%0D%0A%0D%0ACasi%20todos%20los%20ejemplos%20que%20ve%C3%ADa%20p" title="del.icio.us"><img src="http://shakaran.net/blog/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a></li><li><a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fshakaran.net%2Fblog%2F2009%2F02%2Fpalindromo-en-c-desde-un-fichero%2F&amp;t=Pal%C3%ADndromo%20en%20C%20desde%20un%20fichero" title="Facebook"><img src="http://shakaran.net/blog/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a></li><li><a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fshakaran.net%2Fblog%2F2009%2F02%2Fpalindromo-en-c-desde-un-fichero%2F&amp;title=Pal%C3%ADndromo%20en%20C%20desde%20un%20fichero&amp;annotation=Introducci%C3%B3n%0D%0AEstos%20d%C3%ADas%20he%20tenido%20que%20hacer%20un%20peque%C3%B1o%20ejemplo%20de%20un%20programa%20en%20C%2C%20aparentemente%20sencillo%2C%20pero%20del%20que%20no%20he%20encontrado%20buenas%20soluciones%20en%20Google%2C%20ni%20siguiera%20en%20otros%20idiomas%20m%C3%A1s%20dados.%0D%0A%0D%0ACasi%20todos%20los%20ejemplos%20que%20ve%C3%ADa%20p" title="Google Bookmarks"><img src="http://shakaran.net/blog/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a></li><li><a rel="nofollow"  target="_blank" href="http://barrapunto.com/submit.pl?subj=Pal%C3%ADndromo%20en%20C%20desde%20un%20fichero&amp;story=http%3A%2F%2Fshakaran.net%2Fblog%2F2009%2F02%2Fpalindromo-en-c-desde-un-fichero%2F" title="BarraPunto"><img src="http://shakaran.net/blog/wp-content/plugins/sociable/images/barrapunto.png" title="BarraPunto" alt="BarraPunto" class="sociable-hovers" /></a></li><li><a rel="nofollow"  target="_blank" href="http://bitacoras.com/anotaciones/http%3A%2F%2Fshakaran.net%2Fblog%2F2009%2F02%2Fpalindromo-en-c-desde-un-fichero%2F" title="Bitacoras.com"><img src="http://shakaran.net/blog/wp-content/plugins/sociable/images/bitacoras.png" title="Bitacoras.com" alt="Bitacoras.com" class="sociable-hovers" /></a></li><li><a rel="nofollow"  target="_blank" href="http://meneame.net/submit.php?url=http%3A%2F%2Fshakaran.net%2Fblog%2F2009%2F02%2Fpalindromo-en-c-desde-un-fichero%2F" title="Meneame"><img src="http://shakaran.net/blog/wp-content/plugins/sociable/images/meneame.png" title="Meneame" alt="Meneame" class="sociable-hovers" /></a></li><li><a rel="nofollow"  target="_blank" href="http://www.printfriendly.com/print?url=http%3A%2F%2Fshakaran.net%2Fblog%2F2009%2F02%2Fpalindromo-en-c-desde-un-fichero%2F&amp;partner=sociable" title="PDF"><img src="http://shakaran.net/blog/wp-content/plugins/sociable/images/pdf.png" title="PDF" alt="PDF" class="sociable-hovers" /></a></li><li><a rel="nofollow"  target="_blank" href="http://shakaran.net/blog/feed/" title="RSS"><img src="http://shakaran.net/blog/wp-content/plugins/sociable/images/rss.png" title="RSS" alt="RSS" class="sociable-hovers" /></a></li><li><a rel="nofollow"  target="_blank" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fshakaran.net%2Fblog%2F2009%2F02%2Fpalindromo-en-c-desde-un-fichero%2F&amp;title=Pal%C3%ADndromo%20en%20C%20desde%20un%20fichero" title="StumbleUpon"><img src="http://shakaran.net/blog/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a></li><li class="sociablelast"><a rel="nofollow"  target="_blank" href="http://technorati.com/faves?add=http%3A%2F%2Fshakaran.net%2Fblog%2F2009%2F02%2Fpalindromo-en-c-desde-un-fichero%2F" title="Technorati"><img src="http://shakaran.net/blog/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a></li></ul></div><p>Entradas relacionadas:<ol><li><a href='http://shakaran.net/blog/2008/07/cumplir-estandar-w3c-con-target-blank-utilizando-mootools/' rel='bookmark' title='Permanent Link: Cumplir estandar W3C con target=&#8221;_blank&#8221; utilizando Mootools'>Cumplir estandar W3C con target=&#8221;_blank&#8221; utilizando Mootools</a></li><li><a href='http://shakaran.net/blog/2008/11/glsl-basico-desde-cero/' rel='bookmark' title='Permanent Link: GLSL básico desde cero'>GLSL básico desde cero</a></li></ol></p>]]></content:encoded> <wfw:commentRss>http://shakaran.net/blog/2009/02/palindromo-en-c-desde-un-fichero/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk
Page Caching using disk (enhanced)
Database Caching 14/51 queries in 0.182 seconds using disk
Object Caching 1343/1359 objects using disk
Content Delivery Network via shakaran.net.nyud.net

Served from: shakaran.net @ 2010-09-03 17:07:49 -->