はじめまして。
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");
}
}
}
isdigitの使い方
Re:isdigitの使い方
> strcpy(*c,argv[2])
どういうふうに入力しているのか判りませんけど、argv[1]の間違いじゃないですか?
※ソースを記載する場合は規約に従って字下げしてください。
どういうふうに入力しているのか判りませんけど、argv[1]の間違いじゃないですか?
※ソースを記載する場合は規約に従って字下げしてください。
Re:isdigitの使い方
>Mistさん
すみません。
入力したときにスペースを入れたつもりだったのですが、
なってませんでした。
argv[2]も[1]の間違いです。
申し訳ありませんでした。。
すみません。
入力したときにスペースを入れたつもりだったのですが、
なってませんでした。
argv[2]も[1]の間違いです。
申し訳ありませんでした。。
Re:isdigitの使い方
> 入力したときにスペースを入れたつもりだったのですが、
> なってませんでした。
スペース入れてもダメですよ。
規約を読んでください、ソースを投稿する方法が書いてあります。
とりあえず malloc のとこ閉じカッコが足りないねぇ。
> なってませんでした。
スペース入れてもダメですよ。
規約を読んでください、ソースを投稿する方法が書いてあります。
とりあえず malloc のとこ閉じカッコが足りないねぇ。
Re:isdigitの使い方
ヒントを出すと
*c
この書き方ではあなたの期待する通りに動作していません。
そのため、2文字目以降は期待しているところとは違うところを参照しているため正常に動作しません。
*c
この書き方ではあなたの期待する通りに動作していません。
そのため、2文字目以降は期待しているところとは違うところを参照しているため正常に動作しません。
Re:isdigitの使い方
>SooAさん
すみません。それも抜けてました。。
>Mistさん
こちらの拙い質問に、何度も返信ありがとうございます。
実際、for文で文字数分まではまわらないけれども、
何回かは(実際4文字の数字を引数に入力して実行した場合は3回)動いていました。
やっぱりポインタはむずかしいです。。
すみません。それも抜けてました。。
>Mistさん
こちらの拙い質問に、何度も返信ありがとうございます。
実際、for文で文字数分まではまわらないけれども、
何回かは(実際4文字の数字を引数に入力して実行した場合は3回)動いていました。
やっぱりポインタはむずかしいです。。
Re:isdigitの使い方
> サブのisdigitでsegmentation faultになります。。
提示されたソースコードはコンパイルが通りません。
コンパイルが通るソースコードを<pre>と</pre>ではさんで
提示してください(<>は半角で)。
提示されたソースコードはコンパイルが通りません。
コンパイルが通るソースコードを<pre>と</pre>ではさんで
提示してください(<>は半角で)。
Re:isdigitの使い方
>boxさん
見ていただいてありがとうございます。
通らなかったですか。。。自分のソースコードから抜粋しているからかもです。
メインです
subでわざわざ引数を取得(mallocしたりstrcpyしたり)しているのは、
sub以降にも他のサブがあってそこで使用したいからです。
(ソースは抜粋です)
見ていただいてありがとうございます。
通らなかったですか。。。自分のソースコードから抜粋しているからかもです。
メインです
#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の使い方
>Mistさん
優先順位はいまいち?だったのですが、
*c
を
(*c)
こうするとうまくうごきました。
*とc、cとの結合?優先?が
ちゃんと判断されていなかったということでしょうか。
優先順位はいまいち?だったのですが、
*c
を
(*c)
こうするとうまくうごきました。
*とc、cとの結合?優先?が
ちゃんと判断されていなかったということでしょうか。
Re:isdigitの使い方
みなさまありがとうございました。
結局タイトルの「isdigitの使い方」でもポインタが原因でもなかったですが、
本当にお世話になりました。
これからも宜しくお願いします。
結局タイトルの「isdigitの使い方」でもポインタが原因でもなかったですが、
本当にお世話になりました。
これからも宜しくお願いします。
Re:isdigitの使い方
その通りです。
*c
こう書いた場合は[/url]が優先して解決されるので
*(c)
と同じです。
実際には違うのですが、c[0]と処理したいのにc[0]と処理していると考えれば間違いがわかりやすいかと思います。
*c
こう書いた場合は[/url]が優先して解決されるので
*(c)
と同じです。
実際には違うのですが、c[0]と処理したいのにc[0]と処理していると考えれば間違いがわかりやすいかと思います。