<?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>Serendip</title>
	<atom:link href="http://www.serendip.ws/feed" rel="self" type="application/rss+xml" />
	<link>http://www.serendip.ws</link>
	<description>Webデザイン・プログラミング</description>
	<lastBuildDate>Mon, 08 Feb 2010 13:19:20 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>演習5-6 K&amp;R プログラミング言語C</title>
		<link>http://www.serendip.ws/archives/4137</link>
		<comments>http://www.serendip.ws/archives/4137#comments</comments>
		<pubDate>Mon, 08 Feb 2010 13:19:20 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[language-c]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=4137</guid>
		<description><![CDATA[演習5-6
これまでに作った各関数をポインタを使って書き直す。
getline
#include &#60;stdio.h&#62;

#define MAXLINE 1024

int getline(char*, int);

int main(void)
{
    char line[MAXLINE];
    int l, m;

    l = getline(line, MAXLINE);
    printf(&#34;\&#34;%s\&#34;'s length =&#62; %d\n&#34;, line, l);

    m = getline2(line, MAXLINE);
    printf(&#34;\&#34;%s\&#34;'s length =&#62; %d\n&#34;, line, m);

    return 0;
}

int [...]]]></description>
			<content:encoded><![CDATA[<h3>演習5-6</h3>
<p>これまでに作った各関数をポインタを使って書き直す。</p>
<h4><code>getline</code></h4>
<pre><span class="PreProc">#include </span><span class="Constant">&lt;stdio.h&gt;</span>

<span class="PreProc">#define MAXLINE </span><span class="Constant">1024</span>

<span class="Type">int</span> getline(<span class="Type">char</span>*, <span class="Type">int</span>);

<span class="Type">int</span> main(<span class="Type">void</span>)
{
    <span class="Type">char</span> line[MAXLINE];
    <span class="Type">int</span> l, m;

    l = getline(line, MAXLINE);
    printf(<span class="Constant">&quot;</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">'s length =&gt; </span><span class="Special">%d</span><span class="Special">\n</span><span class="Constant">&quot;</span>, line, l);

    m = getline2(line, MAXLINE);
    printf(<span class="Constant">&quot;</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">'s length =&gt; </span><span class="Special">%d</span><span class="Special">\n</span><span class="Constant">&quot;</span>, line, m);

    <span class="Statement">return</span> <span class="Constant">0</span>;
}

<span class="Type">int</span> getline(<span class="Type">char</span> *s, <span class="Type">int</span> lim)
{
    <span class="Type">int</span> c, t;

    t = lim;
    <span class="Statement">while</span> (--lim &gt; <span class="Constant">0</span> &amp;&amp; (c = getchar()) != <span class="Constant">EOF</span> &amp;&amp; c != <span class="Special">'\n'</span>)
        *s++ = c;
    <span class="Statement">if</span> (c == <span class="Special">'\n'</span>)
        *s++ = c;
    *s = <span class="Special">'\0'</span>;
    <span class="Statement">return</span> t - lim;
}
</pre>
<p>実行結果</p>
<pre>$ cat hoge.txt
hello
$ ./getline &lt;hoge.txt
&quot;hello
&quot;'s length =&gt; 6
</pre>
<h4><code>atoi</code></h4>
<pre><span class="PreProc">#include </span><span class="Constant">&lt;stdio.h&gt;</span>
<span class="PreProc">#include </span><span class="Constant">&lt;ctype.h&gt;</span>

<span class="Type">int</span> atoi(<span class="Type">char</span>*);

<span class="Type">int</span> main(<span class="Type">void</span>)
{
    <span class="Type">char</span> *s = <span class="Constant">&quot;1280&quot;</span>;
    <span class="Type">char</span> *t = <span class="Constant">&quot;-324&quot;</span>;

    printf(<span class="Constant">&quot;</span><span class="Special">%s</span><span class="Constant">/2 =&gt; </span><span class="Special">%d</span><span class="Special">\n</span><span class="Constant">&quot;</span>, s, atoi(s) / <span class="Constant">2</span>);
    printf(<span class="Constant">&quot;</span><span class="Special">%s</span><span class="Constant">*2 =&gt; </span><span class="Special">%d</span><span class="Special">\n</span><span class="Constant">&quot;</span>, t, atoi(t) * <span class="Constant">2</span>);

    <span class="Statement">return</span> <span class="Constant">0</span>;
}

<span class="Type">int</span> atoi(<span class="Type">char</span> *s)
{
    <span class="Type">int</span> n = <span class="Constant">0</span>;
    <span class="Type">int</span> sign;

    <span class="Statement">while</span> (isspace(*s)) <span class="Comment">/*</span><span class="Comment"> 空白を飛ばす </span><span class="Comment">*/</span>
        s++;

    sign = *s == <span class="Constant">'-'</span> ? -<span class="Constant">1</span> : <span class="Constant">1</span>;
    <span class="Statement">if</span> (*s == <span class="Constant">'-'</span> || *s == <span class="Constant">'+'</span>) <span class="Comment">/*</span><span class="Comment"> 符号を飛ばす </span><span class="Comment">*/</span>
        s++;

    <span class="Statement">while</span> (isdigit(*s))
        n = <span class="Constant">10</span> * n + (*s++ - <span class="Constant">'0'</span>);

    <span class="Statement">return</span> sign * n;
}
</pre>
<p>実行結果</p>
<pre>$ ./atoi
1280/2 =&gt; 640
-324*2 =&gt; -648
</pre>
<h4><code>itoa</code>, <code>reverse</code></h4>
<pre><span class="PreProc">#include </span><span class="Constant">&lt;stdio.h&gt;</span>

<span class="PreProc">#define MAX </span><span class="Constant">100</span>

<span class="Type">void</span> itoa(<span class="Type">int</span>, <span class="Type">char</span>*);
<span class="Type">void</span> reverse(<span class="Type">char</span>*);

<span class="Type">int</span> main(<span class="Type">void</span>)
{
    <span class="Type">int</span> i = <span class="Constant">123</span>;
    <span class="Type">int</span> j = -<span class="Constant">256</span>;
    <span class="Type">char</span> s1[MAX], s2[MAX];

    itoa(i, s1);
    itoa(i*<span class="Constant">2</span>, s2);
    printf(<span class="Constant">&quot;</span><span class="Special">%s</span><span class="Constant">*2 =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, s1, s2);

    itoa(j, s1);
    itoa(j/<span class="Constant">2</span>, s2);
    printf(<span class="Constant">&quot;</span><span class="Special">%s</span><span class="Constant">/2 =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, s1, s2);

    <span class="Statement">return</span> <span class="Constant">0</span>;
}

<span class="Type">void</span> itoa(<span class="Type">int</span> n, <span class="Type">char</span> *s)
{
    <span class="Type">int</span> sign;
    <span class="Type">char</span> *pt;

    pt = s; <span class="Comment">/*</span><span class="Comment"> 先頭アドレスを保存 </span><span class="Comment">*/</span>
    <span class="Statement">if</span> ((sign = n) &lt; <span class="Constant">0</span>)
        n = -n;

    <span class="Statement">do</span> {
        *s++ = n % <span class="Constant">10</span> + <span class="Constant">'0'</span>;
    } <span class="Statement">while</span> ((n /= <span class="Constant">10</span>) &gt; <span class="Constant">0</span>);

    <span class="Statement">if</span> (sign &lt; <span class="Constant">0</span>)
        *s++ = <span class="Constant">'-'</span>;

    *s = <span class="Special">'\0'</span>;
    s = pt; <span class="Comment">/*</span><span class="Comment"> 先頭アドレスを指し示すように変更 </span><span class="Comment">*/</span>
    reverse(s);
}

<span class="Type">void</span> reverse(<span class="Type">char</span> *s)
{
    <span class="Type">char</span> *p;
    <span class="Type">char</span> tmp;

    p = s;
    <span class="Statement">while</span>(*s)
        s++;
    s--;
    <span class="Statement">while</span> (p &lt; s) {
        tmp = *s;
        *s = *p;
        *p = tmp;
        p++;
        s--;
    }
}
</pre>
<p>実行結果</p>
<pre>$ ./itoa
123*2 =&gt; 246
-256/2 =&gt; -128
</pre>
<p>以下の <code>itoa</code> はローカルのポインタ変数を返しているので正常に動作しない。</p>
<pre><span class="Type">char</span> *itoa(<span class="Type">int</span> n)
{
    <span class="Type">int</span> sign;
    <span class="Type">char</span> _a[MAX];
    <span class="Type">char</span> *s, *pt;

    pt = s = _a;
    <span class="Statement">if</span> ((sign = n) &lt; <span class="Constant">0</span>) {
        n = -n;
    }

    <span class="Statement">do</span> {
        *s++ = n % <span class="Constant">10</span> + <span class="Constant">'0'</span>;
    } <span class="Statement">while</span> ((n /= <span class="Constant">10</span>) &gt; <span class="Constant">0</span>);

    <span class="Statement">if</span> (sign &lt; <span class="Constant">0</span>)
        *s++ = <span class="Constant">'-'</span>;

    *s = <span class="Special">'\0'</span>;
    s = pt;
    reverse(s);

    <span class="Statement">return</span> s; <span class="Comment">/*</span><span class="Comment"> ローカルのポインタ変数を返している </span><span class="Comment">*/</span>
}
</pre>
<h4><code>strindex</code></h4>
<pre><span class="PreProc">#include </span><span class="Constant">&lt;stdio.h&gt;</span>

<span class="Type">int</span> strindex(<span class="Type">char</span>*, <span class="Type">char</span>*);

<span class="Type">int</span> main(<span class="Type">void</span>)
{
    <span class="Type">char</span> *s = <span class="Constant">&quot;hello, world&quot;</span>;
    <span class="Type">char</span> *t = <span class="Constant">&quot;world&quot;</span>;
    <span class="Type">char</span> *u = <span class="Constant">&quot;word&quot;</span>;

    printf(<span class="Constant">&quot;strindex(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">); =&gt; </span><span class="Special">%d</span><span class="Special">\n</span><span class="Constant">&quot;</span>, s, t, strindex(s, t));
    printf(<span class="Constant">&quot;strindex(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">); =&gt; </span><span class="Special">%d</span><span class="Special">\n</span><span class="Constant">&quot;</span>, s, u, strindex(s, u));

    <span class="Statement">return</span> <span class="Constant">0</span>;
}

<span class="Type">int</span> strindex(<span class="Type">char</span> *s, <span class="Type">char</span> *t)
{
    <span class="Type">int</span> i, j, k;

    <span class="Statement">for</span> (i=<span class="Constant">0</span>; *(s+i); i++) {
        <span class="Statement">for</span> (j=i, k=<span class="Constant">0</span>; *(t+k) &amp;&amp; *(s+j) == *(t+k); j++, k++)
            ;
        <span class="Statement">if</span> (k &gt; <span class="Constant">0</span> &amp;&amp; !*(t+k))
            <span class="Statement">return</span> i;
    }

    <span class="Statement">return</span> -<span class="Constant">1</span>;
}
</pre>
<p>実行結果</p>
<pre>$ ./strindex
strindex(&quot;hello, world&quot;, &quot;world&quot;); =&gt; 7
strindex(&quot;hello, world&quot;, &quot;word&quot;); =&gt; -1
</pre>
<h4><code>getop</code></h4>
<pre><span class="Type">int</span> getop(<span class="Type">char</span> *s)
{
    <span class="Type">int</span> c;
    <span class="Type">char</span> *pt;

    pt = s;
    <span class="Statement">while</span> ((*s = c = getch()) == <span class="Constant">' '</span> || c == <span class="Special">'\t'</span>)
        ;
    *++s = <span class="Special">'\0'</span>;
    <span class="Statement">if</span> (!isdigit(c) &amp;&amp; c != <span class="Constant">'.'</span>)
        <span class="Statement">return</span> c; <span class="Comment">/*</span><span class="Comment"> 数ではない </span><span class="Comment">*/</span>
    s = pt;
    <span class="Statement">if</span> (isdigit(c)) <span class="Comment">/*</span><span class="Comment"> 整数部を集める </span><span class="Comment">*/</span>
        <span class="Statement">while</span> (isdigit(*++s = c = getch()))
            ;
    <span class="Statement">if</span> (c == <span class="Constant">'.'</span>) <span class="Comment">/*</span><span class="Comment"> 小数部を集める </span><span class="Comment">*/</span>
        <span class="Statement">while</span> (isdigit(*++s = c = getch()))
            ;
    *s = <span class="Special">'\0'</span>;
    <span class="Statement">if</span> (c != <span class="Constant">EOF</span>)
        ungetch(c);

    <span class="Statement">return</span> NUMBER;
}
</pre>
<div class="amazlet-box" style="margin-bottom:0px;font-size:9pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/41W69WGATNL._SL160_.jpg" alt="プログラミング言語C 第2版 ANSI規格準拠" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-left:15px;margin-top:10px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">プログラミング言語C 第2版 ANSI規格準拠</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4320026926/serendip7822-22/ref=nosim/" title="プログラミング言語C 第2版 ANSI規格準拠" target="_blank">amazlet</a> at 09.11.27</div>
</div>
<div class="amazlet-detail">B.W. カーニハン D.M. リッチー <br />共立出版 <br />売り上げランキング: 9726</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/4137/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>演習5-5 K&amp;R プログラミング言語C</title>
		<link>http://www.serendip.ws/archives/4119</link>
		<comments>http://www.serendip.ws/archives/4119#comments</comments>
		<pubDate>Sun, 07 Feb 2010 14:49:41 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[language-c]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=4119</guid>
		<description><![CDATA[演習5-5
strncpy と strncat の返り値のポインタは最初に退避させておく。
strncpy
#include &#60;stdio.h&#62;
#include &#60;string.h&#62;

#define MAX 100

char *my_strncpy(char*, char*, int);

int main(void)
{
    char *s = &#34;hello&#34;;
    char s1[MAX] = &#34;hello&#34;;
    char s2[MAX] = &#34;hello&#34;;
    char s3[MAX] = &#34;hello&#34;;
    char s4[MAX] = &#34;hello&#34;;
    char s5[MAX] = &#34;hello&#34;;
  [...]]]></description>
			<content:encoded><![CDATA[<h3>演習5-5</h3>
<p><code>strncpy</code> と <code>strncat</code> の返り値のポインタは最初に退避させておく。</p>
<h4><code>strncpy</code></h4>
<pre><span class="PreProc">#include </span><span class="Constant">&lt;stdio.h&gt;</span>
<span class="PreProc">#include </span><span class="Constant">&lt;string.h&gt;</span>

<span class="PreProc">#define MAX </span><span class="Constant">100</span>

<span class="Type">char</span> *my_strncpy(<span class="Type">char</span>*, <span class="Type">char</span>*, <span class="Type">int</span>);

<span class="Type">int</span> main(<span class="Type">void</span>)
{
    <span class="Type">char</span> *s = <span class="Constant">&quot;hello&quot;</span>;
    <span class="Type">char</span> s1[MAX] = <span class="Constant">&quot;hello&quot;</span>;
    <span class="Type">char</span> s2[MAX] = <span class="Constant">&quot;hello&quot;</span>;
    <span class="Type">char</span> s3[MAX] = <span class="Constant">&quot;hello&quot;</span>;
    <span class="Type">char</span> s4[MAX] = <span class="Constant">&quot;hello&quot;</span>;
    <span class="Type">char</span> s5[MAX] = <span class="Constant">&quot;hello&quot;</span>;
    <span class="Type">char</span> s6[MAX] = <span class="Constant">&quot;hello&quot;</span>;
    <span class="Type">char</span> *ct1 = <span class="Constant">&quot;world&quot;</span>;
    <span class="Type">char</span> *ct2 = <span class="Constant">&quot;world&quot;</span>;
    <span class="Type">char</span> *ct3 = <span class="Constant">&quot;world&quot;</span>;
    <span class="Type">char</span> *ct4 = <span class="Constant">&quot;world&quot;</span>;
    <span class="Type">char</span> *ct5 = <span class="Constant">&quot;world&quot;</span>;
    <span class="Type">char</span> *ct6 = <span class="Constant">&quot;world&quot;</span>;

    printf(<span class="Constant">&quot;strncpy(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">%d</span><span class="Constant">) =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, s, ct1, <span class="Constant">2</span>, strncpy(s1, ct1, <span class="Constant">2</span>));
    printf(<span class="Constant">&quot;strncpy(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">%d</span><span class="Constant">) =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, s, ct2, <span class="Constant">5</span>, strncpy(s2, ct2, <span class="Constant">5</span>));
    printf(<span class="Constant">&quot;strncpy(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">%d</span><span class="Constant">) =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, s, ct3, <span class="Constant">9</span>, strncpy(s3, ct3, <span class="Constant">9</span>));

    printf(<span class="Constant">&quot;my_strncpy(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">%d</span><span class="Constant">) =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, s, ct4, <span class="Constant">2</span>, my_strncpy(s4, ct4, <span class="Constant">2</span>));
    printf(<span class="Constant">&quot;my_strncpy(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">%d</span><span class="Constant">) =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, s, ct5, <span class="Constant">5</span>, my_strncpy(s5, ct5, <span class="Constant">5</span>));
    printf(<span class="Constant">&quot;my_strncpy(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">%d</span><span class="Constant">) =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, s, ct6, <span class="Constant">9</span>, my_strncpy(s6, ct6, <span class="Constant">9</span>));

    <span class="Statement">return</span> <span class="Constant">0</span>;
}

<span class="Type">char</span> *my_strncpy(<span class="Type">char</span> *s, <span class="Type">char</span> *ct, <span class="Type">int</span> n)
{
    <span class="Type">char</span> *rt;

    rt = s;
    <span class="Statement">while</span> (*ct &amp;&amp; n) {
        *s++ = *ct++;
        n--;
    }
    <span class="Statement">if</span> (n &gt; <span class="Constant">0</span>)
        *s = <span class="Special">'\0'</span>;

    <span class="Statement">return</span> rt;
}
</pre>
<p>実行結果</p>
<pre>$ ./strncpy
strncpy(&quot;hello&quot;, &quot;world&quot;, 2) =&gt; wollo
strncpy(&quot;hello&quot;, &quot;world&quot;, 5) =&gt; world
strncpy(&quot;hello&quot;, &quot;world&quot;, 9) =&gt; world
my_strncpy(&quot;hello&quot;, &quot;world&quot;, 2) =&gt; wollo
my_strncpy(&quot;hello&quot;, &quot;world&quot;, 5) =&gt; world
my_strncpy(&quot;hello&quot;, &quot;world&quot;, 9) =&gt; world
</pre>
<h4><code>strncat</code></h4>
<pre><span class="PreProc">#include </span><span class="Constant">&lt;stdio.h&gt;</span>
<span class="PreProc">#include </span><span class="Constant">&lt;string.h&gt;</span>

<span class="PreProc">#define MAX </span><span class="Constant">100</span>

<span class="Type">char</span> *my_strncat(<span class="Type">char</span>*, <span class="Type">char</span>*, <span class="Type">int</span>);

<span class="Type">int</span> main(<span class="Type">void</span>)
{
    <span class="Type">char</span> *s = <span class="Constant">&quot;hello&quot;</span>;
    <span class="Type">char</span> s1[MAX] = <span class="Constant">&quot;hello&quot;</span>;
    <span class="Type">char</span> s2[MAX] = <span class="Constant">&quot;hello&quot;</span>;
    <span class="Type">char</span> s3[MAX] = <span class="Constant">&quot;hello&quot;</span>;
    <span class="Type">char</span> s4[MAX] = <span class="Constant">&quot;hello&quot;</span>;
    <span class="Type">char</span> s5[MAX] = <span class="Constant">&quot;hello&quot;</span>;
    <span class="Type">char</span> s6[MAX] = <span class="Constant">&quot;hello&quot;</span>;
    <span class="Type">char</span> *ct1 = <span class="Constant">&quot;world&quot;</span>;
    <span class="Type">char</span> *ct2 = <span class="Constant">&quot;world&quot;</span>;
    <span class="Type">char</span> *ct3 = <span class="Constant">&quot;world&quot;</span>;
    <span class="Type">char</span> *ct4 = <span class="Constant">&quot;world&quot;</span>;
    <span class="Type">char</span> *ct5 = <span class="Constant">&quot;world&quot;</span>;
    <span class="Type">char</span> *ct6 = <span class="Constant">&quot;world&quot;</span>;

    printf(<span class="Constant">&quot;strncat(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">%d</span><span class="Constant">) =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, s, ct1, <span class="Constant">2</span>, strncat(s1, ct1, <span class="Constant">2</span>));
    printf(<span class="Constant">&quot;strncat(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">%d</span><span class="Constant">) =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, s, ct2, <span class="Constant">5</span>, strncat(s2, ct2, <span class="Constant">5</span>));
    printf(<span class="Constant">&quot;strncat(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">%d</span><span class="Constant">) =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, s, ct3, <span class="Constant">9</span>, strncat(s3, ct3, <span class="Constant">9</span>));

    printf(<span class="Constant">&quot;my_strncat(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">%d</span><span class="Constant">) =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, s, ct4, <span class="Constant">2</span>, my_strncat(s4, ct4, <span class="Constant">2</span>));
    printf(<span class="Constant">&quot;my_strncat(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">%d</span><span class="Constant">) =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, s, ct5, <span class="Constant">5</span>, my_strncat(s5, ct5, <span class="Constant">5</span>));
    printf(<span class="Constant">&quot;my_strncat(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">%d</span><span class="Constant">) =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, s, ct6, <span class="Constant">9</span>, my_strncat(s6, ct6, <span class="Constant">9</span>));

    <span class="Statement">return</span> <span class="Constant">0</span>;
}

<span class="Type">char</span> *my_strncat(<span class="Type">char</span> *s, <span class="Type">char</span> *ct, <span class="Type">int</span> n)
{
    <span class="Type">char</span> *rt;

    rt = s;
    <span class="Statement">while</span> (*s)
        s++;
    <span class="Statement">while</span> (*ct &amp;&amp; n) {
        *s++ = *ct++;
        n--;
    }
    <span class="Statement">if</span> (n &gt; <span class="Constant">0</span>)
        *s = <span class="Special">'\0'</span>;

    <span class="Statement">return</span> rt;
}
</pre>
<p>実行結果</p>
<pre>$ ./strncat
strncat(&quot;hello&quot;, &quot;world&quot;, 2) =&gt; hellowo
strncat(&quot;hello&quot;, &quot;world&quot;, 5) =&gt; helloworld
strncat(&quot;hello&quot;, &quot;worlds&quot;, 9) =&gt; helloworlds
my_strncat(&quot;hello&quot;, &quot;world&quot;, 2) =&gt; hellowo
my_strncat(&quot;hello&quot;, &quot;world&quot;, 5) =&gt; helloworld
my_strncat(&quot;hello&quot;, &quot;worlds&quot;, 9) =&gt; helloworlds
</pre>
<h4><code>strncmp</code></h4>
<pre><span class="PreProc">#include </span><span class="Constant">&lt;stdio.h&gt;</span>
<span class="PreProc">#include </span><span class="Constant">&lt;string.h&gt;</span>

<span class="Type">int</span> my_strncmp(<span class="Type">char</span>*, <span class="Type">char</span>*, <span class="Type">int</span>);

<span class="Type">int</span> main(<span class="Type">void</span>)
{
    <span class="Type">char</span> *ct1 = <span class="Constant">&quot;world&quot;</span>;
    <span class="Type">char</span> *ct2 = <span class="Constant">&quot;worlds&quot;</span>;

    printf(<span class="Constant">&quot;strncmp(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">%d</span><span class="Constant">) =&gt; </span><span class="Special">%d</span><span class="Special">\n</span><span class="Constant">&quot;</span>, ct1, ct2, <span class="Constant">2</span>, strncmp(ct1, ct2, <span class="Constant">2</span>));
    printf(<span class="Constant">&quot;strncmp(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">%d</span><span class="Constant">) =&gt; </span><span class="Special">%d</span><span class="Special">\n</span><span class="Constant">&quot;</span>, ct1, ct2, <span class="Constant">5</span>, strncmp(ct1, ct2, <span class="Constant">5</span>));
    printf(<span class="Constant">&quot;strncmp(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">%d</span><span class="Constant">) =&gt; </span><span class="Special">%d</span><span class="Special">\n</span><span class="Constant">&quot;</span>, ct1, ct2, <span class="Constant">6</span>, strncmp(ct1, ct2, <span class="Constant">6</span>));
    printf(<span class="Constant">&quot;strncmp(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">%d</span><span class="Constant">) =&gt; </span><span class="Special">%d</span><span class="Special">\n</span><span class="Constant">&quot;</span>, ct2, ct1, <span class="Constant">6</span>, strncmp(ct2, ct1, <span class="Constant">6</span>));

    printf(<span class="Constant">&quot;my_strncmp(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">%d</span><span class="Constant">) =&gt; </span><span class="Special">%d</span><span class="Special">\n</span><span class="Constant">&quot;</span>, ct1, ct2, <span class="Constant">2</span>, my_strncmp(ct1, ct2, <span class="Constant">2</span>));
    printf(<span class="Constant">&quot;my_strncmp(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">%d</span><span class="Constant">) =&gt; </span><span class="Special">%d</span><span class="Special">\n</span><span class="Constant">&quot;</span>, ct1, ct2, <span class="Constant">5</span>, my_strncmp(ct1, ct2, <span class="Constant">5</span>));
    printf(<span class="Constant">&quot;my_strncmp(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">%d</span><span class="Constant">) =&gt; </span><span class="Special">%d</span><span class="Special">\n</span><span class="Constant">&quot;</span>, ct1, ct2, <span class="Constant">6</span>, my_strncmp(ct1, ct2, <span class="Constant">6</span>));
    printf(<span class="Constant">&quot;my_strncmp(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">%d</span><span class="Constant">) =&gt; </span><span class="Special">%d</span><span class="Special">\n</span><span class="Constant">&quot;</span>, ct2, ct1, <span class="Constant">6</span>, my_strncmp(ct2, ct1, <span class="Constant">6</span>));

    <span class="Statement">return</span> <span class="Constant">0</span>;
}

<span class="Type">int</span> my_strncmp(<span class="Type">char</span> *cs, <span class="Type">char</span> *ct, <span class="Type">int</span> n)
{
    <span class="Statement">while</span> (n &amp;&amp; (*cs &amp;&amp; *ct) &amp;&amp; *cs++ == *ct++)
        n--;
    <span class="Statement">if</span> (n == <span class="Constant">0</span> || (!*cs &amp;&amp; !*ct)) <span class="Comment">/*</span><span class="Comment"> n が 0, または, *cs と *ct が共に '\0' </span><span class="Comment">*/</span>
        <span class="Statement">return</span> <span class="Constant">0</span>;

    <span class="Statement">return</span> *cs - *ct;
}
</pre>
<p>実行結果</p>
<pre>$ ./strncmp
strncmp(&quot;world&quot;, &quot;worlds&quot;, 2) =&gt; 0
strncmp(&quot;world&quot;, &quot;worlds&quot;, 5) =&gt; 0
strncmp(&quot;world&quot;, &quot;worlds&quot;, 6) =&gt; -115
strncmp(&quot;worlds&quot;, &quot;world&quot;, 6) =&gt; 115
my_strncmp(&quot;world&quot;, &quot;worlds&quot;, 2) =&gt; 0
my_strncmp(&quot;world&quot;, &quot;worlds&quot;, 5) =&gt; 0
my_strncmp(&quot;world&quot;, &quot;worlds&quot;, 6) =&gt; -115
my_strncmp(&quot;worlds&quot;, &quot;world&quot;, 6) =&gt; 115
</pre>
<div class="amazlet-box" style="margin-bottom:0px;font-size:9pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/41W69WGATNL._SL160_.jpg" alt="プログラミング言語C 第2版 ANSI規格準拠" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-left:15px;margin-top:10px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">プログラミング言語C 第2版 ANSI規格準拠</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4320026926/serendip7822-22/ref=nosim/" title="プログラミング言語C 第2版 ANSI規格準拠" target="_blank">amazlet</a> at 09.11.27</div>
</div>
<div class="amazlet-detail">B.W. カーニハン D.M. リッチー <br />共立出版 <br />売り上げランキング: 9726</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/4119/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>演習5-4 K&amp;R プログラミング言語C</title>
		<link>http://www.serendip.ws/archives/4116</link>
		<comments>http://www.serendip.ws/archives/4116#comments</comments>
		<pubDate>Sat, 06 Feb 2010 14:57:43 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[language-c]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=4116</guid>
		<description><![CDATA[演習5-4
t のポインタを文字列終端に移動させる際に、条件節で i をインクリメントしているのは、終端に到達した際にもインクリメントするため。
これは、文字列の比較が終端文字から始まるため。
文字列 t が文字列 s の終わりに]]></description>
			<content:encoded><![CDATA[<h3>演習5-4</h3>
<p><code>t</code> のポインタを文字列終端に移動させる際に、条件節で <code>i</code> をインクリメントしているのは、終端に到達した際にもインクリメントするため。<br />
これは、文字列の比較が終端文字から始まるため。<br />
文字列 <code>t</code> が文字列 <code>s</code> の終わりに存在すれば <code>i</code> は <code>0</code> までデクリメントされる。</p>
<pre><span class="PreProc">#include </span><span class="Constant">&lt;stdio.h&gt;</span>

<span class="Type">int</span> strend(<span class="Type">char</span>*, <span class="Type">char</span>*);

<span class="Type">int</span> main(<span class="Type">void</span>)
{
    <span class="Type">char</span> *s = <span class="Constant">&quot;hello, world&quot;</span>;
    <span class="Type">char</span> *t1 = <span class="Constant">&quot;world&quot;</span>;
    <span class="Type">char</span> *t2 = <span class="Constant">&quot;sorld&quot;</span>;

    printf(<span class="Constant">&quot;strend(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">); =&gt; </span><span class="Special">%d</span><span class="Special">\n</span><span class="Constant">&quot;</span>, s, t1, strend(s, t1));
    printf(<span class="Constant">&quot;strend(</span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">, </span><span class="Special">\&quot;</span><span class="Special">%s</span><span class="Special">\&quot;</span><span class="Constant">); =&gt; </span><span class="Special">%d</span><span class="Special">\n</span><span class="Constant">&quot;</span>, s, t2, strend(s, t2));

    <span class="Statement">return</span> <span class="Constant">0</span>;
}

<span class="Type">int</span> strend(<span class="Type">char</span> *s, <span class="Type">char</span> *t)
{
    <span class="Type">int</span> i = <span class="Constant">0</span>;

    <span class="Comment">/*</span><span class="Comment"> ポインタを各文字列終端'\0'へ移動させる </span><span class="Comment">*/</span>
    <span class="Statement">while</span> (*s)
        s++;
    <span class="Statement">while</span> (++i &amp;&amp; *t)
        t++;

    <span class="Comment">/*</span><span class="Comment"> 後方から前方に向けて、文字を比較する </span><span class="Comment">*/</span>
    <span class="Statement">while</span> (*s-- == *t-- &amp;&amp; i &gt;= <span class="Constant">0</span>)
        i--;

    <span class="Statement">return</span> i == <span class="Constant">0</span>;
}
</pre>
<p>実行結果</p>
<pre>$ ./ex5-4
strend(&quot;hello, world&quot;, &quot;world&quot;); =&gt; 1
strend(&quot;hello, world&quot;, &quot;sorld&quot;); =&gt; 0
</pre>
<div class="amazlet-box" style="margin-bottom:0px;font-size:9pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/41W69WGATNL._SL160_.jpg" alt="プログラミング言語C 第2版 ANSI規格準拠" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-left:15px;margin-top:10px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">プログラミング言語C 第2版 ANSI規格準拠</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4320026926/serendip7822-22/ref=nosim/" title="プログラミング言語C 第2版 ANSI規格準拠" target="_blank">amazlet</a> at 09.11.27</div>
</div>
<div class="amazlet-detail">B.W. カーニハン D.M. リッチー <br />共立出版 <br />売り上げランキング: 9726</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/4116/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>5.5 文字ポインタと関数, 演習5-3 K&amp;R プログラミング言語C</title>
		<link>http://www.serendip.ws/archives/4111</link>
		<comments>http://www.serendip.ws/archives/4111#comments</comments>
		<pubDate>Fri, 05 Feb 2010 13:31:16 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[language-c]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=4111</guid>
		<description><![CDATA[5.5 文字ポインタと関数
以下のように文字列定数の内容を書き換えようとすると失敗する。
#include &#60;stdio.h&#62;

int main(void)
{
    char amessage[] = &#34;now is the time&#34;; /* 配列 */
    char *pmessage = &#34;now is the time&#34;;  /* ポインタ */

    printf(&#34;amessage[] =&#62; %s\n&#34;, amessage);
    printf(&#34;*pmessage =&#62; %s\n&#34;, pmessage);

    printf(&#34;----------\n&#34;);

    amessage[0] = 'N'; [...]]]></description>
			<content:encoded><![CDATA[<h3>5.5 文字ポインタと関数</h3>
<p>以下のように文字列定数の内容を書き換えようとすると失敗する。</p>
<pre><span class="PreProc">#include </span><span class="Constant">&lt;stdio.h&gt;</span>

<span class="Type">int</span> main(<span class="Type">void</span>)
{
    <span class="Type">char</span> amessage[] = <span class="Constant">&quot;now is the time&quot;</span>; <span class="Comment">/*</span><span class="Comment"> 配列 </span><span class="Comment">*/</span>
    <span class="Type">char</span> *pmessage = <span class="Constant">&quot;now is the time&quot;</span>;  <span class="Comment">/*</span><span class="Comment"> ポインタ </span><span class="Comment">*/</span>

    printf(<span class="Constant">&quot;amessage[] =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, amessage);
    printf(<span class="Constant">&quot;*pmessage =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, pmessage);

    printf(<span class="Constant">&quot;----------</span><span class="Special">\n</span><span class="Constant">&quot;</span>);

    amessage[<span class="Constant">0</span>] = <span class="Constant">'N'</span>; <span class="Comment">/*</span><span class="Comment"> 配列版の先頭文字を書き換える。 </span><span class="Comment">*/</span>
    printf(<span class="Constant">&quot;amessage[] =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, amessage);

    *pmessage = <span class="Constant">'N'</span>; <span class="Comment">/*</span><span class="Comment"> ポインタ版の先頭文字を書き換える。 </span><span class="Comment">*/</span>
    printf(<span class="Constant">&quot;*pmessage =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, pmessage);

    <span class="Statement">return</span> <span class="Constant">0</span>;
}
</pre>
<p>実行結果</p>
<pre>$ ./str_test
amessage[] =&gt; now is the time
*pmessage =&gt; now is the time
----------
amessage[] =&gt; Now is the time
Bus error
</pre>
<p>ポインタの指し示す先を配列版の先頭に変更すると、ポインタ版の文字の変更は配列版の変更となる。</p>
<pre><span class="PreProc">#include </span><span class="Constant">&lt;stdio.h&gt;</span>

<span class="Type">int</span> main(<span class="Type">void</span>)
{
    <span class="Type">char</span> amessage[] = <span class="Constant">&quot;now is the time&quot;</span>; <span class="Comment">/*</span><span class="Comment"> 配列 </span><span class="Comment">*/</span>
    <span class="Type">char</span> *pmessage = <span class="Constant">&quot;now is the time&quot;</span>;  <span class="Comment">/*</span><span class="Comment"> ポインタ </span><span class="Comment">*/</span>

    printf(<span class="Constant">&quot;amessage[] =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, amessage);
    printf(<span class="Constant">&quot;*pmessage =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, pmessage);

    printf(<span class="Constant">&quot;----------</span><span class="Special">\n</span><span class="Constant">&quot;</span>);

    pmessage = &amp;amessage[<span class="Constant">0</span>]; <span class="Comment">/*</span><span class="Comment"> ポインタを配列版の文字列を指し示すように変更する。 </span><span class="Comment">*/</span>
    *pmessage = <span class="Constant">'N'</span>; <span class="Comment">/*</span><span class="Comment"> 先頭文字を書き換える。 =&gt; 配列版の文字列が書き換えられる。 </span><span class="Comment">*/</span>
    printf(<span class="Constant">&quot;amessage[] =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, amessage);
    printf(<span class="Constant">&quot;*pmessage =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, pmessage);

    <span class="Statement">return</span> <span class="Constant">0</span>;
}
</pre>
<p>実行結果</p>
<pre>$ ./str
amessage[] =&gt; now is the time
*pmessage =&gt; now is the time
----------
amessage[] =&gt; Now is the time
*pmessage =&gt; Now is the time
</pre>
<h3>演習5-3</h3>
<pre><span class="PreProc">#include </span><span class="Constant">&lt;stdio.h&gt;</span>
<span class="PreProc">#include </span><span class="Constant">&lt;string.h&gt;</span> <span class="Comment">/*</span><span class="Comment"> strcpy を使うため </span><span class="Comment">*/</span>

<span class="Type">void</span> my_strcat(<span class="Type">char</span>*, <span class="Type">char</span>*);
<span class="Type">void</span> my_strcat2(<span class="Type">char</span>*, <span class="Type">char</span>*);

<span class="Type">int</span> main(<span class="Type">void</span>)
{
    <span class="Type">char</span> s1[] = <span class="Constant">&quot;hello&quot;</span>;
    <span class="Type">char</span> s2[] = <span class="Constant">&quot;, world.&quot;</span>;
    <span class="Type">char</span> s3[] = <span class="Constant">&quot;from &quot;</span>;
    <span class="Type">char</span> s4[] = <span class="Constant">&quot;Japan.&quot;</span>;

    my_strcat(s1, s2);
    printf(<span class="Constant">&quot;my_strcat(s1, s2); =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, s1);

    my_strcat2(s3, s4);
    printf(<span class="Constant">&quot;my_strcat2(s3, s4); =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, s3);

    <span class="Statement">return</span> <span class="Constant">0</span>;
}

<span class="Type">void</span> my_strcat(<span class="Type">char</span> *s, <span class="Type">char</span> *t)
{
    <span class="Comment">/*</span><span class="Comment"> s の指し示す文字が真の間（終端文字の'\0'に達するまで）ポインタをインクリメントする。 </span><span class="Comment">*/</span>
    <span class="Statement">while</span> (*s)
        s++;
    <span class="Comment">/*</span><span class="Comment"> *t を *s に代入し、代入した文字が終端文字'\0'でなければ、それぞれのポインタをインクリメントしてループを繰り返す。 </span><span class="Comment">*/</span>
    <span class="Statement">while</span> (*s++ = *t++)
        ;
}

<span class="Comment">/*</span><span class="Comment"> strcpy を使った版。while の条件節を少しわかりやすくした。 </span><span class="Comment">*/</span>
<span class="Type">void</span> my_strcat2(<span class="Type">char</span> *s, <span class="Type">char</span> *t)
{
    <span class="Statement">while</span> (*s != <span class="Special">'\0'</span>)
        s++;
    strcpy(s, t); <span class="Comment">/*</span><span class="Comment"> strcpy が開始される時点で s は '\0' を指している。 </span><span class="Comment">*/</span>
}
</pre>
<p>実行結果</p>
<pre>$ ./ex5-3
my_strcat(s1, s2); =&gt; hello, world.
my_strcat2(s3, s4); =&gt; from Japan.
</pre>
<div class="amazlet-box" style="margin-bottom:0px;font-size:9pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/41W69WGATNL._SL160_.jpg" alt="プログラミング言語C 第2版 ANSI規格準拠" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-left:15px;margin-top:10px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">プログラミング言語C 第2版 ANSI規格準拠</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4320026926/serendip7822-22/ref=nosim/" title="プログラミング言語C 第2版 ANSI規格準拠" target="_blank">amazlet</a> at 09.11.27</div>
</div>
<div class="amazlet-detail">B.W. カーニハン D.M. リッチー <br />共立出版 <br />売り上げランキング: 9726</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/4111/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>5.4 アドレス計算 K&amp;R プログラミング言語C</title>
		<link>http://www.serendip.ws/archives/4091</link>
		<comments>http://www.serendip.ws/archives/4091#comments</comments>
		<pubDate>Thu, 04 Feb 2010 12:46:03 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[language-c]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=4091</guid>
		<description><![CDATA[5.4 アドレス計算

正常にアドレスを指し示すポインタは 0 にはならない。
0 は異常値を表し、stdio.h で定義されている NULL を使う。
ポインタは同じ配列の要素を指し示している場合には、==, !=, &#60;, &#62;, &#60;=, &#62;= などの関係演算子を利用できる。
ポインタと整]]></description>
			<content:encoded><![CDATA[<h3>5.4 アドレス計算</h3>
<ul class="entry-list-style">
<li>正常にアドレスを指し示すポインタは <code>0</code> にはならない。</li>
<li><code>0</code> は異常値を表し、<code>stdio.h</code> で定義されている <code>NULL</code> を使う。</li>
<li>ポインタは同じ配列の要素を指し示している場合には、<code>==</code>, <code>!=</code>, <code>&lt;</code>, <code>&gt;</code>, <code>&lt;=</code>, <code>&gt;=</code> などの関係演算子を利用できる。</li>
<li>ポインタと整数との間の加減算は、ポインタが指し示すオブジェクトの型のサイズに応じて適切にスケールされる。<br />
<code>p + n</code> は <code>(p の先頭アドレス) + (sizeof p) * n</code> となる。</li>
</ul>
<h4>正しいポインタ演算</h4>
<ul class="entry-list-style">
<li>同じ型のポインタの代入</li>
<li>ポインタと整数の加算・減算</li>
<li>同じ配列の要素を指し示すポインタの引き算と比較</li>
<li>ゼロ(<code>NULL</code>)の代入やゼロ(<code>NULL</code>)との比較</li>
</ul>
<h4><code>alloc</code>, <code>afree</code></h4>
<p>以下のプログラム例での <code>allocbuf</code> の状態。</p>
<p><img src="http://www.serendip.ws/wordpress/wp-content/uploads/allocbuf_k_and_r_001.png" alt="allocbuf の状態図" title="allocbuf の状態図" width="500" height="106" class="size-full wp-image-4103" /></p>
<pre><span class="PreProc">#include </span><span class="Constant">&lt;stdio.h&gt;</span>

<span class="PreProc">#define ALLOCSIZE </span><span class="Constant">10000</span><span class="PreProc"> </span><span class="Comment">/*</span><span class="Comment"> 使用可能な場所の大きさ </span><span class="Comment">*/</span>

<span class="Type">static</span> <span class="Type">char</span> allocbuf[ALLOCSIZE]; <span class="Comment">/*</span><span class="Comment"> alloc のための記憶場所 </span><span class="Comment">*/</span>
<span class="Type">static</span> <span class="Type">char</span> *allocp = allocbuf;  <span class="Comment">/*</span><span class="Comment"> 次の空き位置(allocbuf の先頭アドレスを指して初期化) </span><span class="Comment">*/</span>

<span class="Type">char</span> *alloc(<span class="Type">int</span>);
<span class="Type">void</span> afree(<span class="Type">char</span>*);

<span class="Type">int</span> main(<span class="Type">void</span>)
{
    <span class="Type">int</span> n;
    <span class="Type">char</span> *p, *q;

    printf(<span class="Constant">&quot;p =&gt; </span><span class="Special">%p</span><span class="Special">\n</span><span class="Constant">&quot;</span>, p);
    printf(<span class="Constant">&quot;q =&gt; </span><span class="Special">%p</span><span class="Special">\n</span><span class="Constant">&quot;</span>, q);
    n = <span class="Constant">10</span>;
    p = alloc(n);
    printf(<span class="Constant">&quot;p =&gt; </span><span class="Special">%p</span><span class="Special">\n</span><span class="Constant">&quot;</span>, p);
    *p = <span class="Constant">'a'</span>;
    *(p+<span class="Constant">1</span>) = <span class="Constant">'b'</span>;
    *(p+<span class="Constant">2</span>) = <span class="Constant">'c'</span>;
    *(p+<span class="Constant">3</span>) = <span class="Special">'\0'</span>;
    printf(<span class="Constant">&quot;allocbuf =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, allocbuf); <span class="Comment">/*</span><span class="Comment"> p で確保した allocbuf の領域が使用されている </span><span class="Comment">*/</span>
    q = alloc(n);
    printf(<span class="Constant">&quot;q =&gt; </span><span class="Special">%p</span><span class="Special">\n</span><span class="Constant">&quot;</span>, q);
    *q = <span class="Constant">'A'</span>;
    *(q+<span class="Constant">1</span>) = <span class="Constant">'B'</span>;
    *(q+<span class="Constant">2</span>) = <span class="Constant">'C'</span>;
    *(q+<span class="Constant">3</span>) = <span class="Special">'\0'</span>;
    printf(<span class="Constant">&quot;allocbuf[n] =&gt; </span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, &amp;allocbuf[n]); <span class="Comment">/*</span><span class="Comment"> q で確保した allocbuf の領域が使用されている </span><span class="Comment">*/</span>
    afree(p);
    afree(q);
    printf(<span class="Constant">&quot;p =&gt; </span><span class="Special">%p</span><span class="Special">\n</span><span class="Constant">&quot;</span>, p);
    printf(<span class="Constant">&quot;q =&gt; </span><span class="Special">%p</span><span class="Special">\n</span><span class="Constant">&quot;</span>, q);

    <span class="Statement">return</span> <span class="Constant">0</span>;
}

<span class="Comment">/*</span><span class="Comment"> n 文字へのポインタを返す </span><span class="Comment">*/</span>
<span class="Type">char</span> *alloc(<span class="Type">int</span> n)
{
    <span class="Statement">if</span> (allocbuf + ALLOCSIZE - allocp &gt;= n) { <span class="Comment">/*</span><span class="Comment"> 入りきる </span><span class="Comment">*/</span>
        allocp += n;
        <span class="Statement">return</span> allocp - n; <span class="Comment">/*</span><span class="Comment"> 古い p </span><span class="Comment">*/</span>
    } <span class="Statement">else</span> { <span class="Comment">/*</span><span class="Comment"> 十分な空きがないとき </span><span class="Comment">*/</span>
        <span class="Statement">return</span> <span class="Constant">0</span>; <span class="Comment">/*</span><span class="Comment"> 異常事態を表わす 0 、通常は NULL (stdio.h で定義) を使う </span><span class="Comment">*/</span>
    }
}

<span class="Comment">/*</span><span class="Comment"> p によって指される領域を解放する </span><span class="Comment">*/</span>
<span class="Type">void</span> afree(<span class="Type">char</span> *p)
{
    <span class="Statement">if</span> (p &gt;= allocbuf &amp;&amp; p &lt; allocbuf + ALLOCSIZE) {
        allocp = p;
    }
}
</pre>
<p>実行結果</p>
<pre>$ ./alloc
p =&gt; 0x7fff5fbfebe8
q =&gt; 0x0
p =&gt; 0x100001080
allocbuf =&gt; abc
q =&gt; 0x10000108a
allocbuf[n] =&gt; ABC
p =&gt; 0x100001080
q =&gt; 0x10000108a
</pre>
<div class="amazlet-box" style="margin-bottom:0px;font-size:9pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/41W69WGATNL._SL160_.jpg" alt="プログラミング言語C 第2版 ANSI規格準拠" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-left:15px;margin-top:10px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">プログラミング言語C 第2版 ANSI規格準拠</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4320026926/serendip7822-22/ref=nosim/" title="プログラミング言語C 第2版 ANSI規格準拠" target="_blank">amazlet</a> at 09.11.27</div>
</div>
<div class="amazlet-detail">B.W. カーニハン D.M. リッチー <br />共立出版 <br />売り上げランキング: 9726</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/4091/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>サイトのメンテナンスを行う際の .htaccess 設定</title>
		<link>http://www.serendip.ws/archives/4277</link>
		<comments>http://www.serendip.ws/archives/4277#comments</comments>
		<pubDate>Wed, 03 Feb 2010 11:31:45 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=4277</guid>
		<description><![CDATA[サイトのメンテナンスを行う際に、訪問者にはメンテナンス中であることを示す画面 /maintenance/index.html を表示し、検索ロボットには 503 HTTPステータスコードを返す .htaccess の設定方法。
メンテナンス画面表示用のファイルを配置するディレクトリ /maintenance を作る。
]]></description>
			<content:encoded><![CDATA[<p>サイトのメンテナンスを行う際に、訪問者にはメンテナンス中であることを示す画面 /maintenance/index.html を表示し、検索ロボットには <code>503</code> <a href="http://ja.wikipedia.org/wiki/HTTP%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89" class="out">HTTPステータスコード</a>を返す .htaccess の設定方法。</p>
<p>メンテナンス画面表示用のファイルを配置するディレクトリ /maintenance を作る。</p>
<p>サーバにメンテナンス中を示すページのファイル /maintenance/index.html を配置する。</p>
<p>メンテナンス中ページに画像を表示する場合は画像ファイル /maintenance/maintenance.png を必要に応じて配置する。</p>
<p><code>503</code> ステータスコード（サービス利用不可）を返し、/maintenance/index.html の内容を表示させるために、以下の PHP スクリプト /maintenance/503.php を配置する。</p>
<pre><span class="Special">&lt;?php</span>
<span class="Identifier">header</span> <span class="Special">(</span>'<span class="Constant">HTTP/1.0 503 Service Temporarily Unavailable</span>'<span class="Special">)</span>;
<span class="Identifier">readfile</span><span class="Special">(</span><span class="Identifier">dirname</span><span class="Special">(</span><span class="Constant">__FILE__</span><span class="Special">)</span> <span class="Statement">.</span> '<span class="Constant">/index.html</span>'<span class="Special">)</span>;
<span class="Special">?&gt;</span>
</pre>
<p>メンテナンスを行うディレクトリに、以下の記述の .htaccess ファイルを配置する。<br />
メンテナンス作業者の IP アドレスを記述しておくと、作業者は通常の画面表示を確認できる。</p>
<pre><span class="Identifier">RewriteEngine</span> <span class="Constant">On</span>
<span class="Identifier">RewriteCond</span> %{REMOTE_ADDR} !=192.168.0.2
<span class="Identifier">RewriteCond</span> %{REQUEST_URI} !=/maintenance/503.php
<span class="Identifier">RewriteCond</span> %{REQUEST_URI} !=/maintenance/maintenance.png
<span class="Identifier">RewriteRule</span> ^.*$ /maintenance/503.php [L]
</pre>
<p>メンテナンス用ファイルを検索クローラーにキャッシュされないように、以下の記述を robot.txt に加える。</p>
<pre>User-Agent: *
Disallow: /maintenance/
</pre>
<p>これで、サイトメンテナンス中のページを検索クローラーにキャッシュされずに、訪問者にはメンテナンス中であることを示すページを表示することができる。</p>
<p><img src="http://www.serendip.ws/wordpress/wp-content/uploads/maintenance_screenshot_001.png" alt="メンテナンス画面例 Screenshot" title="メンテナンス画面例 Screenshot" width="504" height="451" class="size-full wp-image-4278" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/4277/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google イメージ検索画像をレイヤー上に表示 (Chrome Extension)</title>
		<link>http://www.serendip.ws/archives/4272</link>
		<comments>http://www.serendip.ws/archives/4272#comments</comments>
		<pubDate>Tue, 02 Feb 2010 12:44:20 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[お知らせ]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=4272</guid>
		<description><![CDATA[Google Chrome 拡張機能の『Google イメージ検索画像をレイヤー上に表示 (Chrome Extension)』を公開しました。
]]></description>
			<content:encoded><![CDATA[<p>Google Chrome 拡張機能の『<a href="/software/ce-google-image-search">Google イメージ検索画像をレイヤー上に表示 (Chrome Extension)</a>』を公開しました。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/4272/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>5.3 ポインタと配列 K&amp;R プログラミング言語C</title>
		<link>http://www.serendip.ws/archives/4088</link>
		<comments>http://www.serendip.ws/archives/4088#comments</comments>
		<pubDate>Mon, 01 Feb 2010 13:48:31 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[language-c]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=4088</guid>
		<description><![CDATA[5.3 ポインタと配列
#include &#60;stdio.h&#62;

int main(void)
{
    int i, len;
    int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int *pa;

    len = (sizeof a) / (sizeof a[0]);

    printf(&#34;a[] =&#62; &#34;);
    for (i = 0; i [...]]]></description>
			<content:encoded><![CDATA[<h3>5.3 ポインタと配列</h3>
<pre><span class="PreProc">#include </span><span class="Constant">&lt;stdio.h&gt;</span>

<span class="Type">int</span> main(<span class="Type">void</span>)
{
    <span class="Type">int</span> i, len;
    <span class="Type">int</span> a[] = {<span class="Constant">1</span>, <span class="Constant">2</span>, <span class="Constant">3</span>, <span class="Constant">4</span>, <span class="Constant">5</span>, <span class="Constant">6</span>, <span class="Constant">7</span>, <span class="Constant">8</span>, <span class="Constant">9</span>, <span class="Constant">10</span>};
    <span class="Type">int</span> *pa;

    len = (<span class="Statement">sizeof</span> a) / (<span class="Statement">sizeof</span> a[<span class="Constant">0</span>]);

    printf(<span class="Constant">&quot;a[] =&gt; &quot;</span>);
    <span class="Statement">for</span> (i = <span class="Constant">0</span>; i &lt; len; i++) {
        printf(<span class="Constant">&quot;,</span><span class="Special">%d</span><span class="Constant">&quot;</span>, a[i]);
    }
    printf(<span class="Constant">&quot;</span><span class="Special">\n</span><span class="Constant">&quot;</span>);

    <span class="Comment">/*</span><span class="Comment"> a は配列先頭のアドレス </span><span class="Comment">*/</span>
    pa = a; <span class="Comment">/*</span><span class="Comment"> pa = &amp;a[0]; と同じ </span><span class="Comment">*/</span>
    printf(<span class="Constant">&quot;*pa =&gt; &quot;</span>);
    <span class="Statement">for</span> (i = <span class="Constant">0</span>; i &lt; len; i++) {
        printf(<span class="Constant">&quot;,</span><span class="Special">%d</span><span class="Constant">&quot;</span>, *pa++);
    }
    printf(<span class="Constant">&quot;</span><span class="Special">\n</span><span class="Constant">&quot;</span>);

    <span class="Comment">/*</span><span class="Comment"> *(a+i) は a[i] と同じ </span><span class="Comment">*/</span>
    printf(<span class="Constant">&quot;*(a+i) =&gt; &quot;</span>);
    <span class="Statement">for</span> (i = <span class="Constant">0</span>; i &lt; len; i++) {
        printf(<span class="Constant">&quot;,</span><span class="Special">%d</span><span class="Constant">&quot;</span>, *a+i);
    }
    printf(<span class="Constant">&quot;</span><span class="Special">\n</span><span class="Constant">&quot;</span>);

    <span class="Comment">/*</span><span class="Comment"> 再び pa を配列先頭のアドレスを指すようにする </span><span class="Comment">*/</span>
    pa = a;
    printf(<span class="Constant">&quot;pa[i] =&gt; &quot;</span>);
    <span class="Statement">for</span> (i = <span class="Constant">0</span>; i &lt; len; i++) {
        printf(<span class="Constant">&quot;,</span><span class="Special">%d</span><span class="Constant">&quot;</span>, pa[i]);
    }
    printf(<span class="Constant">&quot;</span><span class="Special">\n</span><span class="Constant">&quot;</span>);

    <span class="Statement">return</span> <span class="Constant">0</span>;
}
</pre>
<p>実行結果</p>
<pre>$ ./ptr_ary
a[] =&gt; ,1,2,3,4,5,6,7,8,9,10
*pa =&gt; ,1,2,3,4,5,6,7,8,9,10
*(a+i) =&gt; ,1,2,3,4,5,6,7,8,9,10
pa[i] =&gt; ,1,2,3,4,5,6,7,8,9,10
</pre>
<div class="amazlet-box" style="margin-bottom:0px;font-size:9pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/41W69WGATNL._SL160_.jpg" alt="プログラミング言語C 第2版 ANSI規格準拠" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-left:15px;margin-top:10px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">プログラミング言語C 第2版 ANSI規格準拠</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4320026926/serendip7822-22/ref=nosim/" title="プログラミング言語C 第2版 ANSI規格準拠" target="_blank">amazlet</a> at 09.11.27</div>
</div>
<div class="amazlet-detail">B.W. カーニハン D.M. リッチー <br />共立出版 <br />売り上げランキング: 9726</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/4088/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>演習5-2 K&amp;R プログラミング言語C</title>
		<link>http://www.serendip.ws/archives/4083</link>
		<comments>http://www.serendip.ws/archives/4083#comments</comments>
		<pubDate>Sun, 31 Jan 2010 13:13:31 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[language-c]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=4083</guid>
		<description><![CDATA[演習5-2
#include &#60;stdio.h&#62;
#include &#60;ctype.h&#62;

#define SIZE 100
#define BUFSIZE 100

int getch(void);
void ungetch(int);

int main(void)
{
    double array[SIZE];
    int n, m, getfloat(double *);
    int i;

    n = 0;
    while (n &#60; SIZE &#38;&#38; (m = getfloat(&#38;array[n])) != EOF) {
        [...]]]></description>
			<content:encoded><![CDATA[<h3>演習5-2</h3>
<pre><span class="PreProc">#include </span><span class="Constant">&lt;stdio.h&gt;</span>
<span class="PreProc">#include </span><span class="Constant">&lt;ctype.h&gt;</span>

<span class="PreProc">#define SIZE </span><span class="Constant">100</span>
<span class="PreProc">#define BUFSIZE </span><span class="Constant">100</span>

<span class="Type">int</span> getch(<span class="Type">void</span>);
<span class="Type">void</span> ungetch(<span class="Type">int</span>);

<span class="Type">int</span> main(<span class="Type">void</span>)
{
    <span class="Type">double</span> array[SIZE];
    <span class="Type">int</span> n, m, getfloat(<span class="Type">double</span> *);
    <span class="Type">int</span> i;

    n = <span class="Constant">0</span>;
    <span class="Statement">while</span> (n &lt; SIZE &amp;&amp; (m = getfloat(&amp;array[n])) != <span class="Constant">EOF</span>) {
        <span class="Statement">if</span> (m &gt; <span class="Constant">0</span>) {
            n++;
        }
    }

    <span class="Statement">for</span> (i = <span class="Constant">0</span>; i &lt; n; i++) {
        printf(<span class="Constant">&quot;</span><span class="Special">%f</span><span class="Special">\n</span><span class="Constant">&quot;</span>, array[i]);
    }

    <span class="Statement">return</span> <span class="Constant">0</span>;
}

<span class="Comment">/*</span><span class="Comment"> getfloat : 入力から次の整数を取り出して *pd に入れる </span><span class="Comment">*/</span>
<span class="Type">int</span> getfloat(<span class="Type">double</span> *pd)
{
    <span class="Type">int</span> c, sign, sign_c;
    <span class="Type">int</span> is_dec = <span class="Constant">0</span>;
    <span class="Type">double</span> dc = <span class="Constant">1.0</span>;

    <span class="Statement">while</span> (isspace(c = getch())) <span class="Comment">/*</span><span class="Comment"> 空白を飛ばす </span><span class="Comment">*/</span>
        ;
    <span class="Statement">if</span> (!isdigit(c) &amp;&amp; c != <span class="Constant">EOF</span> &amp;&amp; c != <span class="Constant">'+'</span> &amp;&amp; c != <span class="Constant">'-'</span> &amp;&amp; c != <span class="Constant">'.'</span>) {
        ungetch(c); <span class="Comment">/*</span><span class="Comment"> 数字ではない </span><span class="Comment">*/</span>
        <span class="Statement">return</span> <span class="Constant">0</span>;
    }
    sign = (c == <span class="Constant">'-'</span>) ? -<span class="Constant">1</span> : <span class="Constant">1</span>;
    <span class="Statement">if</span> (c == <span class="Constant">'+'</span> || c == <span class="Constant">'-'</span>) {
        sign_c = c;
        c = getch();
    }
    <span class="Statement">if</span> (!isdigit(c) &amp;&amp; c != <span class="Constant">EOF</span> &amp;&amp; c != <span class="Constant">'.'</span>) {
        ungetch(sign_c);
        <span class="Statement">return</span> <span class="Constant">0</span>;
    }
    <span class="Statement">for</span> (*pd = <span class="Constant">0.0</span>; isdigit(c) || c == <span class="Constant">'.'</span>; c = getch()) {
        <span class="Statement">if</span> (c == <span class="Constant">'.'</span>) {
            is_dec = <span class="Constant">1</span>;
            <span class="Statement">continue</span>;
        }
        <span class="Statement">if</span> (is_dec) {
            *pd = *pd + (dc /= <span class="Constant">10</span>) * (c - <span class="Constant">'0'</span>);
        } <span class="Statement">else</span> {
            *pd = <span class="Constant">10</span> * *pd + (c - <span class="Constant">'0'</span>);
        }
    }
    *pd *= sign;
    <span class="Statement">if</span> (c != <span class="Constant">EOF</span>)
        ungetch(c);
    <span class="Statement">return</span> c;
}

<span class="Type">char</span> buf[BUFSIZE]; <span class="Comment">/*</span><span class="Comment"> ungetch 用のバッファ </span><span class="Comment">*/</span>
<span class="Type">int</span> bufp = <span class="Constant">0</span>;      <span class="Comment">/*</span><span class="Comment"> buf 中の次の空き位置 </span><span class="Comment">*/</span>

<span class="Type">int</span> getch(<span class="Type">void</span>) <span class="Comment">/*</span><span class="Comment"> (押し戻された可能性もある)1文字をとってくる </span><span class="Comment">*/</span>
{
    <span class="Statement">return</span> (bufp &gt; <span class="Constant">0</span>) ? buf[--bufp] : getchar();
}

<span class="Type">void</span> ungetch(<span class="Type">int</span> c)
{
    <span class="Statement">if</span> (bufp &gt;= BUFSIZE) {
        printf(<span class="Constant">&quot;ungetch: too many characters</span><span class="Special">\n</span><span class="Constant">&quot;</span>);
    } <span class="Statement">else</span> {
        buf[bufp++] = c;
    }
}
</pre>
<p>実行結果</p>
<pre>$ cat hoge.txt
123.123
+456.123
+ 789.123
-321.123
- 654.123
-       987.123
.009
-.009
-  .009
$ ./ex5-2 &lt;hoge.txt
123.123000
456.123000
789.123000
-321.123000
-654.123000
-987.123000
0.009000
-0.009000
-0.009000
</pre>
<div class="amazlet-box" style="margin-bottom:0px;font-size:9pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/41W69WGATNL._SL160_.jpg" alt="プログラミング言語C 第2版 ANSI規格準拠" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-left:15px;margin-top:10px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">プログラミング言語C 第2版 ANSI規格準拠</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4320026926/serendip7822-22/ref=nosim/" title="プログラミング言語C 第2版 ANSI規格準拠" target="_blank">amazlet</a> at 09.11.27</div>
</div>
<div class="amazlet-detail">B.W. カーニハン D.M. リッチー <br />共立出版 <br />売り上げランキング: 9726</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/4083/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>演習5-1 K&amp;R プログラミング言語C</title>
		<link>http://www.serendip.ws/archives/4080</link>
		<comments>http://www.serendip.ws/archives/4080#comments</comments>
		<pubDate>Sat, 30 Jan 2010 14:47:39 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[language-c]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=4080</guid>
		<description><![CDATA[演習5-1
問題文の意味がいまいちわかりにくかったが、 +/- と数字の間に空白があっても +/- 記号が機能するように変更すると解釈した。
+/- 記号があれば sign_c に一時保存して次の文字を読みにいく。
次の文字が数字でなければ（スペースな]]></description>
			<content:encoded><![CDATA[<h3>演習5-1</h3>
<p>問題文の意味がいまいちわかりにくかったが、 <code>+/-</code> と数字の間に空白があっても <code>+/-</code> 記号が機能するように変更すると解釈した。</p>
<p><code>+/-</code> 記号があれば <code>sign_c</code> に一時保存して次の文字を読みにいく。<br />
次の文字が数字でなければ（スペースなどの場合）<code>sign_c</code> に一時保存した <code>+/-</code> 記号を <code>ungetch()</code> で入力に戻し、入力が数でないという印の <code>0</code> を返す。</p>
<pre><span class="PreProc">#include </span><span class="Constant">&lt;stdio.h&gt;</span>
<span class="PreProc">#include </span><span class="Constant">&lt;ctype.h&gt;</span>

<span class="PreProc">#define SIZE </span><span class="Constant">100</span>
<span class="PreProc">#define BUFSIZE </span><span class="Constant">100</span>

<span class="Type">int</span> getch(<span class="Type">void</span>);
<span class="Type">void</span> ungetch(<span class="Type">int</span>);

<span class="Type">int</span> main(<span class="Type">void</span>)
{
    <span class="Type">int</span> n, m, array[SIZE], getint(<span class="Type">int</span> *);
    <span class="Type">int</span> i;

    n = <span class="Constant">0</span>;
    <span class="Statement">while</span> (n &lt; SIZE &amp;&amp; (m = getint(&amp;array[n])) != <span class="Constant">EOF</span>) {
        <span class="Statement">if</span> (m &gt; <span class="Constant">0</span>) {
            n++;
        }
    }

    <span class="Statement">for</span> (i = <span class="Constant">0</span>; i &lt; n; i++) {
        printf(<span class="Constant">&quot;</span><span class="Special">%d</span><span class="Special">\n</span><span class="Constant">&quot;</span>, array[i]);
    }

    <span class="Statement">return</span> <span class="Constant">0</span>;
}

<span class="Comment">/*</span><span class="Comment"> getint : 入力から次の整数を取り出して *pn に入れる </span><span class="Comment">*/</span>
<span class="Type">int</span> getint(<span class="Type">int</span> *pn)
{
    <span class="Type">int</span> c, sign, sign_c;

    <span class="Statement">while</span> (isspace(c = getch())) <span class="Comment">/*</span><span class="Comment"> 空白を飛ばす </span><span class="Comment">*/</span>
        ;
    <span class="Statement">if</span> (!isdigit(c) &amp;&amp; c != <span class="Constant">EOF</span> &amp;&amp; c != <span class="Constant">'+'</span> &amp;&amp; c != <span class="Constant">'-'</span>) {
        ungetch(c); <span class="Comment">/*</span><span class="Comment"> 数字ではない </span><span class="Comment">*/</span>
        <span class="Statement">return</span> <span class="Constant">0</span>;
    }
    sign = (c == <span class="Constant">'-'</span>) ? -<span class="Constant">1</span> : <span class="Constant">1</span>;
    <span class="Statement">if</span> (c == <span class="Constant">'+'</span> || c == <span class="Constant">'-'</span>) {
        sign_c = c;
        c = getch();
    }
    <span class="Statement">if</span> (!isdigit(c) &amp;&amp; c != <span class="Constant">EOF</span>) {
        ungetch(sign_c);
        <span class="Statement">return</span> <span class="Constant">0</span>;
    }
    <span class="Statement">for</span> (*pn = <span class="Constant">0</span>; isdigit(c); c = getch())
        *pn = <span class="Constant">10</span> * *pn + (c - <span class="Constant">'0'</span>);
    *pn *= sign;
    <span class="Statement">if</span> (c != <span class="Constant">EOF</span>)
        ungetch(c);
    <span class="Statement">return</span> c;
}

<span class="Type">char</span> buf[BUFSIZE]; <span class="Comment">/*</span><span class="Comment"> ungetch 用のバッファ </span><span class="Comment">*/</span>
<span class="Type">int</span> bufp = <span class="Constant">0</span>;      <span class="Comment">/*</span><span class="Comment"> buf 中の次の空き位置 </span><span class="Comment">*/</span>

<span class="Type">int</span> getch(<span class="Type">void</span>) <span class="Comment">/*</span><span class="Comment"> (押し戻された可能性もある)1文字をとってくる </span><span class="Comment">*/</span>
{
    <span class="Statement">return</span> (bufp &gt; <span class="Constant">0</span>) ? buf[--bufp] : getchar();
}

<span class="Type">void</span> ungetch(<span class="Type">int</span> c)
{
    <span class="Statement">if</span> (bufp &gt;= BUFSIZE) {
        printf(<span class="Constant">&quot;ungetch: too many characters</span><span class="Special">\n</span><span class="Constant">&quot;</span>);
    } <span class="Statement">else</span> {
        buf[bufp++] = c;
    }
}
</pre>
<p>実行結果</p>
<pre>$ cat hoge.txt
123
+456
+ 789
-321
- 654
-       987
$ ./ex5-1 &lt;hoge.txt
123
456
789
-321
-654
-987
</pre>
<div class="amazlet-box" style="margin-bottom:0px;font-size:9pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/41W69WGATNL._SL160_.jpg" alt="プログラミング言語C 第2版 ANSI規格準拠" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-left:15px;margin-top:10px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">プログラミング言語C 第2版 ANSI規格準拠</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4320026926/serendip7822-22/ref=nosim/" title="プログラミング言語C 第2版 ANSI規格準拠" target="_blank">amazlet</a> at 09.11.27</div>
</div>
<div class="amazlet-detail">B.W. カーニハン D.M. リッチー <br />共立出版 <br />売り上げランキング: 9726</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/4080/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
