char c[100];
char *pc;
pc = c;
printf("Enter the string:\n");
gets(c);
while(*pc != '\0')
{
if(isdigit(*pc)==1)
printf("%c",*pc);
pc++;
}
実行中にエラーが発生しないため、このプログラムで出力が得られないのはなぜですか?ポインタを使用して文字配列の数字をチェックして、ランタイムエラーが発生しました
char c[100];
char *pc;
pc = c;
printf("Enter the string:\n");
gets(c);
while(*pc != '\0')
{
if(isdigit(*pc)==1)
printf("%c",*pc);
pc++;
}
実行中にエラーが発生しないため、このプログラムで出力が得られないのはなぜですか?ポインタを使用して文字配列の数字をチェックして、ランタイムエラーが発生しました
まあ、isdigitは入力パラメータとしてintをとり、char配列を与えています。あなたが代わりにあなたが何をしているかのこのような何かをしたいかもしれません
:
if(isdigit(*pc))
printf("%c",*pc);
pc++;
はintへの文字の暗黙のキャストを行う必要があります。
更新:
は、あなたがもしを行う前に、isdigitの出力を印刷しようとしたことがありますか?
printf("%d",isdigit(*pc));
時には、それはfgets()
は、同じタスクを達成し、それは安全です、gets()
の使用を回避4.
私はコードの最初のスニペットが正しいと信じています。 'isdigit(int c)'は 'int c'をとり、cはある文字のascii値なので' isdigit(1) 'は' isdigit( '1') 'が真のときfalseです。 '* pc'は文字配列ではなく、逆参照された後の文字なので有効です。最後の行は1の&0を表示しますが、有効です:) – Miket25
isdigitは、0または0より大きい数字の値を返します。https://www.programiz.com/c-programming/library-function/ctype.h/ isdigit –
ああ、良い点。また、C11標準の§7.4.1ではゼロと非ゼロを示しています。 – Miket25
などの奇数番号を返します。
#include <stdio.h>
#include <ctype.h>
int main(){
char c[100];
printf("Enter the string:\n");
fgets(c,100,stdin);
int i = 0;
while(c[i] != '\0'){
if(isdigit(c[i])){
printf("%c",c[i]);
}
i++;
}
}
編集: あなたのコードの残りの部分がなければ、エラーの合理的なソースが標準で、比較isdigit(*pc) == 1
で、
C11§7.4.1
このサブクラスの関数は、引数cの値が関数の記述の値に一致する場合に限り、非ゼロ(true)を返します。
つまり、int isdigit(int c);
です。 isdigit
は、真であるときにゼロ以外の値を返している可能性があり、ちょうど1
の比較のために印刷できません。
@PaulR私に知らせてくれてありがとう。スタック上の配列を指しているので、私はその問題の問題に取り組んだ。 – Miket25
回答を修正/改善していただきありがとうございます - ダウン票をアップ票に変換しました! –
問題は== 1
です。isdigitはゼロ以外の値のみを返しています。それを削除するか、何かの理由で1
と比較したい場合は、!!
を控えの前に置いてください
フルプログラムを投稿できますか?関数の 'main(){'部分を含めますか? – J0hn
与えられた入力とあなたの期待される出力は何ですか? – CppLearner
あなたのタイトルにはランタイムエラーがありますが、あなたの質問にはエラーはないと言われています...数字以外の文字を無視して数字だけを表示するプログラムです。不承認の 'gets()'関数を使用していますが、入力が100文字未満の場合は、何が期待どおりに出力されますか? – Miket25