掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.29989

ポインタのポインタ をインクリメント
投稿者---EDY(2007/03/29 19:48:24)


こんばんは。ポインタのポインタについてわからないことがあるのですが。
演習にあった、ポインタのポインタを使って文字列の長さを数えるというプログラムを、ポインタのポインタをインクリメントするように作ってみたのですが(以下)
自分的にはポインタ配列がNULLになるとループを抜け出すように作ったつもりなのですが、結果はループが2回くらい余計におこなわれてしまいます(以下)。
for文を使えばちゃんとできるのですが、なんで以下のプログラムではうまくいかないのかを教えてください。
OSはWindowsXP,コンパイラはLSIC-86試食版です。

<ソースコード>
#include<stdio.h>
main()
{
    char *ptr[]={"Iizumi","Kanto","Kudo","Sato","Sugawara","Matuda","Wada","takenaka"};
    char **len=ptr;
    int i;
    while(*len){
        for(i=0;*(*len+i);i++);
        printf("%d : %s\n",i,*len);
        len++;
    }
}



<結果表示>
6 :Iizumi
5 :Kanto
:
:
2 :0
0 :

です。よろしくお願いします


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ポインタのポインタ をインクリメント 29990 michi 2007/03/29 20:54:33
<子記事> Re:ポインタのポインタ をインクリメント 29995 shu 2007/03/30 10:46:11


No.29990

Re:ポインタのポインタ をインクリメント
投稿者---michi(2007/03/29 20:54:33)


>自分的にはポインタ配列がNULLになるとループを抜け出すように作った

while(*len)とありますが、*lenがNULLになることはありますか?
C言語には配列の末尾にNULLが来るというような決まりはありません。
のでこのループ条件は間違いです。
for文を使って配列の要素数をカウントしてください。



それと
> for(i=0;*(*len+i);i++);

最後の;のせいでfor文が何もしていません。


この投稿にコメントする

削除パスワード

No.29991

Re:ポインタのポインタ をインクリメント
投稿者---yoh2(2007/03/29 21:26:48)


>> for(i=0;*(*len+i);i++);
>
>最後の;のせいでfor文が何もしていません。

変数名に騙されそうになりますが、i = strlen(*len); と同等のことをしていますね。
でもって次のprintf()で 文字数:文字列 を表示している、と。


この投稿にコメントする

削除パスワード

No.29992

Re:ポインタのポインタ をインクリメント
投稿者---michi(2007/03/29 21:41:21)


>変数名に騙されそうになりますが、i = strlen(*len); と同等のことをしていますね。
>でもって次のprintf()で 文字数:文字列 を表示している、と。

しまった(>_<)、普通に文字列の長さはかってますね、恥ずかしい...。


この投稿にコメントする

削除パスワード

No.29994

Re:ポインタのポインタ をインクリメント
投稿者---EDY(2007/03/30 00:10:35)


michiさん、yoh2さん>
どうもありがとうございました!
文字配列の最後にNULLが入るというのを、配列全部に当てはまると思っていました。。
質問するのに変数名とかがわかりにくくつけてしまっていてごめんなさい。
あと、勉強のためいろいろなやり方を試していたので無理やりなプログラムになってしまいました。わかりづらくてごめんなさい。
またよろしくお願いしますm(_ _)m



この投稿にコメントする

削除パスワード

No.29995

Re:ポインタのポインタ をインクリメント
投稿者---shu(2007/03/30 10:46:11)
http://park6.wakwak.com/~nougaki/mini_program/


//
//	配列÷配列の1要素で、要素数を求める
//

#include <stdio.h>

int main(void)
{
    char *p[] = {
        "Izumi", "Kato", "Kudo", "Sato",
        "Sugawara", "Matuda", "Wada", "Takenaka"
    }, **pp;
    int i, n;
    
    n = sizeof p / sizeof p[0];
    
    for (i = 0; i < n; i++)
        printf(" %s", p[i]);
    putchar('\n');
    
    for (i = 0; i < n; i++)
        printf(" %s", *(p + i));
    putchar('\n');
    
    pp = p;	//
    for (i = 0; i < n; i++)
        printf(" %s", *(pp + i));
    putchar('\n');
    
    pp = p;	//
    for (i = 0; i < n; i++)
        printf(" %s", pp[i]);
    putchar('\n');
    
    for (pp = p; pp - p < n; pp++)
        printf(" %s", *pp);
    putchar('\n');
    
    return 0;
}


//
//	ポインタ配列の最後にNULLを入れておく
//

#include <stdio.h>

int main(void)
{
    char *p[] = {
        "Izumi", "Kato", "Kudo", "Sato",
        "Sugawara", "Matuda", "Wada", "Takenaka",
        NULL	//
    }, **pp;
    int i;
    
    for (i = 0; p[i]; i++)
        printf(" %s", p[i]);
    putchar('\n');
    
    for (i = 0; *(p + i); i++)
        printf(" %s", *(p + i));
    putchar('\n');
    
    pp = p;	//
    for (i = 0; *(pp + i); i++)
        printf(" %s", *(pp + i));
    putchar('\n');
    
    pp = p;	//
    for (i = 0; pp[i]; i++)
        printf(" %s", pp[i]);
    putchar('\n');
    
    for (pp = p; *pp; pp++)
        printf(" %s", *pp);
    putchar('\n');
    
    return 0;
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧