学校の宿題で困っています。
読み込んだ文字列が10進数かそうでないかを判定する関数を作る、というものです。
char型の配列に一文字ずつ読み込んで、一文字ずつ判定するというところまで考え付きましたが、
判定の方法(条件)がよくわかりません。以下考え付いたコードもどきです。
よろしくお願いします
入力した文字列が10進数の整数値か調べたい
- purin52002
- 記事: 235
- 登録日時: 7年前
- 連絡を取る:
Re: 入力した文字列が10進数の整数値か調べたい
こんにちは
私だったら与えられた文字(char)が数値かどうかを判定する関数を作り、
与えられた文字列(char*)を1文字ずつこの関数で判定させ、
すべて数値だったかどうかを判定します。
こんな感じのイメージです。
±の符号や0から始まっているかの判定も付け加えるとしたらもう一工夫必要かもしれません^^;
私だったら与えられた文字(char)が数値かどうかを判定する関数を作り、
与えられた文字列(char*)を1文字ずつこの関数で判定させ、
すべて数値だったかどうかを判定します。
int IsDigit(char x)
{
//数値なら1、そうでなければ0を返す
}
int syukudai(char *mojiretu)
{
if(mojiretu == NULL) return 0;
int kaeriti = 1;
while(mojiretu != NULL)
{
if(IsDigit(*mojiretu) != 1) kaeriti = 0;
}
return kaeriti;
}
±の符号や0から始まっているかの判定も付け加えるとしたらもう一工夫必要かもしれません^^;
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^
Re: 入力した文字列が10進数の整数値か調べたい
いろいろ考えていたら返信が遅くなってしまいました。
マイナスが先頭の時も考えなければならないのですがどうもうまく動きません。
配列にうまく代入されていないような気がします。
コンパイルエラーは起こりませんでした。
以下書いたコードです。
マイナスが先頭の時も考えなければならないのですがどうもうまく動きません。
配列にうまく代入されていないような気がします。
コンパイルエラーは起こりませんでした。
以下書いたコードです。
#include<stdio.h>
int str2int(char *x){
int a,b; //aは進数, bは数える用
a=0;
b=0;
if(x[0]=='0'){ //1文字目が0の時
if(x[1]!='\n'){ //2文字目が改行ではない時
a=0;
}else{
a=10;
}
}else if(x[0]='-'){ //1文字目が-
if(x[1]='\n'){ //2文字目が改行
a=0;
}else{
for(b=1;b<99;b++){
if(x[b]<='0'||x[b]>'9'){ //数字以外が来るかどうか
a=0;
break;
}
}
a=10;
}
}else{ //1文字目が1から9だとここに来る(はず)
if(x[0]='\n'){
a=0;
}else{
for(b=1;b<99;b++){
if(x[b]<='0'||x[b]>'9'){
a=0;
break;
}
}
a=10;
}
}
return a;
}
int main(){
char str[100];
int i,n;
i=0;
n=0;
printf("Enter a character string:");
for(i=0;i<99;i++){
scanf("%c",&str[i]);
if(str[i]=='\n'){
break;
}
}
n=str2int(str);
for(i=0;i<99;i++){
if(str[i]=='\n'){
break;
}else{
printf("%c",str[i]);
}
}
printf(" is ");
if(n=10){
printf("decimal number.\n");
}else{
printf("not decimal number.\n");
}
str[0]='\0';
return 0;
}
Re: 入力した文字列が10進数の整数値か調べたい
とりあえずすぐにわかることは、13行目、14行目、26行目、62行目のif文の中で不自然な代入が行われていますね。こんぺいとう さんが書きました:マイナスが先頭の時も考えなければならないのですがどうもうまく動きません。
そういう仮説を立てたなら、デバッガやprintfデバッグなどで本当にそうなのか検証してみるといいでしょう。こんぺいとう さんが書きました:配列にうまく代入されていないような気がします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 入力した文字列が10進数の整数値か調べたい
こんな感じでしょう。
#include <stdio.h>
int isDecimal(const char *x)
{
int i = 0;
if (x[i] が符号であれば)
i++; // 次に進む
if (x[i] が数字でなければ)
return 0; // 10進数ではない
while (x[i] が数字である間)
i++; // どんどん次に進む
if (x[i] != '\0') // 終端でなければ(余計な文字があれば)
return 0; // 10進数ではない
return 1; // 文字列を全部見たので、10進数である
}
int main(void)
{
char str[100];
while (1) {
printf("Enter a character string: ");
if (scanf("%99s", str) != 1) // 最大99文字の文字列を読み込む
break; // 読み込みが失敗すれば終了
if (isDecimal(str)) // 10進数か?
printf(" %s is a decimal number\n", str);
else
printf(" %s is not a decimal number\n", str);
}
return 0;
}
Re: 入力した文字列が10進数の整数値か調べたい
17~22行目、29~34行目のfor文での処理の内容が、それぞれ23行目、35行目でaに10を無条件で代入することによって無効化されています。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 入力した文字列が10進数の整数値か調べたい
ありがとうございます。
かずまさんのコードを参考にして出来上がったのがこれです!
皆さんありがとうございました!!
printfで確かめる方法をすっかり忘れていました。とても便利でした!みけCAT さんが書きました: そういう仮説を立てたなら、デバッガやprintfデバッグなどで本当にそうなのか検証してみるといいでしょう。
確かにせっかく判定しても結局最後でa=10してますね...みけCAT さんが書きました:17~22行目、29~34行目のfor文での処理の内容が、それぞれ23行目、35行目でaに10を無条件で代入することによって無効化されています。
かずまさんのコードを参考にして出来上がったのがこれです!
皆さんありがとうございました!!
int isDecimal(char *x)
{
int i=0;
if(x[i]=='-'){ //最初が-の時
i++; //次から数字かどうか判定するために1進める
}
if(x[i]<'0'||x[i]>'9'){ //0から9ではない時
return 0; //10進数ではない
}else{
while(x[i]>='0'&&x[i]<='9'){ //数字の時
i++; //どんどん次に進む
}
if(x[i]!='\0'){ //終端でなければ(余計な文字があれば)
return 0; //10進数ではない
}
}
return 10; //文字列を全部見たので、10進数
}
int main(void)
{
char str[100];
while(1){
printf("Enter a character string: ");
if(scanf("%99s",str)!=1) // 最大99文字の文字列を読み込む
break; // 読み込みが失敗すれば終了
if(isDecimal(str)){ // 10進数か?
printf("'%s' is a decimal number.\n", str);
}else{
printf("'%s' is not a decimal number.\n", str);
}
}
return 0;
}
Re: 入力した文字列が10進数の整数値か調べたい
読み込んだ文字列が10進数かそうでないかを判定する関数
なので true か false、すなわち 1 か 0 を返せばよいはず
なのになぜ、10を返すのでしょうか?
C の整数定数のような 16進定数や 8進定数も判別したかった]
のでしょうか?
実行例
本当の C の整数定数には符号は付きません。
また u や LL などの接尾語が付くことがあります。
なので true か false、すなわち 1 か 0 を返せばよいはず
なのになぜ、10を返すのでしょうか?
C の整数定数のような 16進定数や 8進定数も判別したかった]
のでしょうか?
#include <stdio.h>
int isHex(unsigned char c)
{
return (c>='0' && c<='9') || (c>='a' && c<='f') || (c>='A' && c<='F');
}
int getBase(const char *p)
{
if (*p == '-' || *p == '+') p++;
if (*p >= '1' && *p <= '9') {
while (*++p >= '0' && *p <= '9') ;
return *p ? 0 : 10;
}
if (*p == '0') {
if (*++p == 'x' || *p == 'X') {
if (!isHex(*++p)) return 0;
while (isHex(*++p)) ;
return *p ? 0 : 16;
}
while (*++p >= '0' && *p <= '7') ;
return *p ? 0 : 8;
}
return 0;
}
int main(void)
{
char str[100];
while (1) {
printf("Enter a character string: ");
if (scanf("%99s", str) != 1 || str[0] == '.') return 0;
switch (getBase(str)) {
case 10: printf(" \"%s\" is a decimal number\n", str); break;
case 16: printf(" \"%s\" is a hexadecimal number\n", str); break;
case 8: printf(" \"%s\" is an octal number\n", str); break;
default: printf(" \"%s\" is not a number\n", str);
}
}
return 0;
}
Enter a character string: -123
"-123" is a decimal number
Enter a character string: 0123
"0123" is an octal number
Enter a character string: 0x123
"0x123" is a hexadecimal number
Enter a character string: x123
"x123" is not a number
Enter a character string: .
また u や LL などの接尾語が付くことがあります。