ページ 11

isdigitの使い方

Posted: 2009年3月25日(水) 14:08
by piyo
はじめまして。
C初心者で特にポインタ関係がいまいち理解できません。。
そのせいもあり、isdigitがうまく動きません。
どこがおかしいのかどなたかご教授お願いします。

以下ソース抜粋です。。
したいことは、引数で取得した値の数値チェックです。
がサブのisdigitでsegmentation faultになります。。

●メイン
int main(int argc, char **argv){
char *c;
int rtn;

rtn=sub(argv,&c);
:
}

●サブ
int sub(char **argv, char **c){
int i;
:
*c=(char *)malloc(sizeof(char)*(strlen(argv[2])+1);
strcpy(*c,argv[2])
for(i=0;i<strlen(*c); i++){
if (isdigit(*c) == 0){
printf("error!\n");
}
}
}

Re:isdigitの使い方

Posted: 2009年3月25日(水) 14:48
by Mist
> strcpy(*c,argv[2])

どういうふうに入力しているのか判りませんけど、argv[1]の間違いじゃないですか?

※ソースを記載する場合は規約に従って字下げしてください。

Re:isdigitの使い方

Posted: 2009年3月25日(水) 14:53
by piyo
>Mistさん
すみません。
入力したときにスペースを入れたつもりだったのですが、
なってませんでした。
argv[2]も[1]の間違いです。
申し訳ありませんでした。。

Re:isdigitの使い方

Posted: 2009年3月25日(水) 15:19
by SooA
> 入力したときにスペースを入れたつもりだったのですが、
> なってませんでした。
スペース入れてもダメですよ。
規約を読んでください、ソースを投稿する方法が書いてあります。

とりあえず malloc のとこ閉じカッコが足りないねぇ。

Re:isdigitの使い方

Posted: 2009年3月25日(水) 15:44
by Mist
ヒントを出すと

*c

この書き方ではあなたの期待する通りに動作していません。
そのため、2文字目以降は期待しているところとは違うところを参照しているため正常に動作しません。

Re:isdigitの使い方

Posted: 2009年3月25日(水) 16:07
by piyo
>SooAさん
すみません。それも抜けてました。。

>Mistさん
こちらの拙い質問に、何度も返信ありがとうございます。
実際、for文で文字数分まではまわらないけれども、
何回かは(実際4文字の数字を引数に入力して実行した場合は3回)動いていました。
やっぱりポインタはむずかしいです。。

Re:isdigitの使い方

Posted: 2009年3月25日(水) 16:29
by Mist
この問題はポインタとは関係ありません。
演算子の優先順位の問題です。

http://www9.plala.or.jp/sgwr-t/c/sec14.html
このページの14-5を読んでください。

Re:isdigitの使い方

Posted: 2009年3月25日(水) 22:55
by box
> サブのisdigitでsegmentation faultになります。。

提示されたソースコードはコンパイルが通りません。
コンパイルが通るソースコードを<pre>と</pre>ではさんで
提示してください(<>は半角で)。

Re:isdigitの使い方

Posted: 2009年3月26日(木) 09:17
by piyo
>boxさん
見ていただいてありがとうございます。
通らなかったですか。。。自分のソースコードから抜粋しているからかもです。

メインです
#include <stdio.h>
#include <stdlib.h>

extern  int sub();

int main(int argc,char **argv)
{
    int         i_sr;
    char        *hikisu

    i_sr = sub(argc, argv, &hikisu );

    if ( i_sr != 0 ){
        return 1;
    }

    return 0;
}
サブです
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <memory.h>

int sub(argc, argv, hikisu)
int     argc;
char    argv;
char    **hikisu;
{
    int     i;

    *hikisu = (char *)malloc(sizeof(char)*(strlen(argv[1])+1));
    if ( *hikisu == NULL ){
        return 1;
    }
    strcpy(*hikisu, argv[1]);
    for (i=0; i<strlen(*hikisu); i++) {
        if ( isdigit(*hikisu) == 0 ){
            return 1;
        }
    }
    return 0;
}


subでわざわざ引数を取得(mallocしたりstrcpyしたり)しているのは、
sub以降にも他のサブがあってそこで使用したいからです。
(ソースは抜粋です)

Re:isdigitの使い方

Posted: 2009年3月26日(木) 09:31
by piyo
>Mistさん
優先順位はいまいち?だったのですが、

*c

(*c)

こうするとうまくうごきました。
*とc、cとの結合?優先?が
ちゃんと判断されていなかったということでしょうか。

Re:isdigitの使い方

Posted: 2009年3月26日(木) 09:38
by piyo
みなさまありがとうございました。
結局タイトルの「isdigitの使い方」でもポインタが原因でもなかったですが、
本当にお世話になりました。

これからも宜しくお願いします。

Re:isdigitの使い方

Posted: 2009年3月26日(木) 09:50
by Mist
その通りです。

*c

こう書いた場合は[/url]が優先して解決されるので

*(c)

と同じです。
実際には違うのですが、c[0]と処理したいのにc[0]と処理していると考えれば間違いがわかりやすいかと思います。