ページ 1 / 1
入力した文字列が10進数の整数値か調べたい
Posted: 2017年12月06日(水) 00:28
by こんぺいとう
学校の宿題で困っています。
読み込んだ文字列が10進数かそうでないかを判定する関数を作る、というものです。
char型の配列に一文字ずつ読み込んで、一文字ずつ判定するというところまで考え付きましたが、
判定の方法(条件)がよくわかりません。以下考え付いたコードもどきです。
コード:
if (一文字目が-(マイナス)){
if (二文字目から最後の文字まで1~9のみ){
n=10;
}else{
n=0;
}
}
if (一文字目が1~9){
if (二文字目から最後の文字まで0~9のみ){
n=10;
}else{
n=0;
}
}
if (一文字目が0){
if (二文字目に数字またはアルファベットがある){
n=0;
}else{
n=10;
}
}
よろしくお願いします
Re: 入力した文字列が10進数の整数値か調べたい
Posted: 2017年12月06日(水) 19:53
by purin52002
こんにちは
私だったら与えられた文字(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から始まっているかの判定も付け加えるとしたらもう一工夫必要かもしれません^^;
Re: 入力した文字列が10進数の整数値か調べたい
Posted: 2017年12月10日(日) 01:48
by こんぺいとう
いろいろ考えていたら返信が遅くなってしまいました。
マイナスが先頭の時も考えなければならないのですがどうもうまく動きません。
配列にうまく代入されていないような気がします。
コンパイルエラーは起こりませんでした。
以下書いたコードです。
コード:
#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進数の整数値か調べたい
Posted: 2017年12月10日(日) 02:19
by みけCAT
こんぺいとう さんが書きました:マイナスが先頭の時も考えなければならないのですがどうもうまく動きません。
とりあえずすぐにわかることは、13行目、14行目、26行目、62行目のif文の中で不自然な代入が行われていますね。
こんぺいとう さんが書きました:配列にうまく代入されていないような気がします。
そういう仮説を立てたなら、デバッガやprintfデバッグなどで本当にそうなのか検証してみるといいでしょう。
Re: 入力した文字列が10進数の整数値か調べたい
Posted: 2017年12月10日(日) 02:20
by かずま
こんな感じでしょう。
コード:
#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進数の整数値か調べたい
Posted: 2017年12月10日(日) 02:32
by みけCAT
17~22行目、29~34行目のfor文での処理の内容が、それぞれ23行目、35行目でaに10を無条件で代入することによって無効化されています。
Re: 入力した文字列が10進数の整数値か調べたい
Posted: 2017年12月10日(日) 20:45
by こんぺいとう
ありがとうございます。
みけCAT さんが書きました:
そういう仮説を立てたなら、デバッガやprintfデバッグなどで本当にそうなのか検証してみるといいでしょう。
printfで確かめる方法をすっかり忘れていました。とても便利でした!
みけCAT さんが書きました:17~22行目、29~34行目のfor文での処理の内容が、それぞれ23行目、35行目でaに10を無条件で代入することによって無効化されています。
確かにせっかく判定しても結局最後で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進数の整数値か調べたい
Posted: 2017年12月11日(月) 12:07
by かずま
読み込んだ文字列が10進数かそうでないかを判定する関数
なので 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: .
本当の C の整数定数には符号は付きません。
また u や LL などの接尾語が付くことがあります。
Re: 入力した文字列が10進数の整数値か調べたい
Posted: 2018年5月11日(金) 03:27
by こんぺいとう
10を返すのは問題文でそうするように指示があったからです。