質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

3560閲覧

文字か数字かを調べる関数 c言語

entio

総合スコア19

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/04/22 03:16

編集2019/04/22 04:02

「入力した文字列が文字か数字かを判断する関数」を作ったのですが、実際にmain関数内で動かしたところ全て-1で返す結果となりました。
どこか間違えている部分があるでしょうか?

str=入力した文字列
n=チェックを行う文字列のバイト数

int numeric_chk(char *str, int n) { int i; for(i=0;i<n;i++) { if ((str[i]>='0')&&(str[i]<='9')) continue; else return(-1); } return 0; コード

追記
閲覧ありがとうございます。
下記がnumeric関数使用までのソースファイルとなります。

#include <stdio.h> #include <fcntl.h> #include <memory.h> #include <string.h> #include <io.h> #include <errno.h> #include <math.h> #include <stdlib.h> #include <sys\types.h> #include <sys\stat.h> /*********************************************************************/ /* 定数の定義 */ /*********************************************************************/ #define CR 0x0D #define LF 0x0A #define DATA SYAIN.MAS /*********************************************************************/ /* 構造体の宣言 */ /*********************************************************************/ struct syain_k { char sno[5]; /* 社員番号 */ char name[20]; /* 氏名 */ char salary[7]; /* 給与 */ char crlf[2]; /* CR/LF */ }; /*********************************************************************/ /* 静的変数の定義 */ /*********************************************************************/ /*********************************************************************/ /* 内部関数のプロトタイプ宣言 */ /*********************************************************************/ int numeric_chk(char *str,int n); int search(char *sno,struct syain_k *rec); void data_disp(struct syain_k *rec); void touroku(int recno, char *sno,char *name,char *salary); /*********************************************************************/ /* main() メイン関数 */ /*********************************************************************/ int Fd; initial_syori() { Fd = open("SYAIN.DAT",O_CREAT); } main() { struct syain_k rdbuf; int a; long d; int recno; char sno; char name; char salary; struct syain_k *rec; while(1) { printf("社員番号を入力してください\n"); scanf("%d",&sno); a=numeric_chk(&sno, 5); if (a==-1) { printf("NUMERICエラー\n"); continue; } else d=atol(&sno); if (d==99999) { return 0; } else if (d>=1000&&d<=90000) { printf("範囲エラー\n"); continue; } コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2019/04/22 04:24 編集

サイズ(n)に文字列のサイズではなく終端(\0)も含んだサイズを入れていませんか? sozeofでやると終端(\0)まで対象になるので−1になりますよ。
guest

回答3

0

ベストアンサー

試してみましたが、正常に動いているように思えます。Wandbox
改行文字を除去し忘れているとか、呼び出し元のコードに問題があるのでは無いでしょうか。

#####質問追記を受けて

C

char sno;
...
scanf("%d",&sno);
a=numeric_chk(&sno, 5);

最初からsnoをint型にすれば良いのでは。
char型として扱う場合も既存のisdigit関数を使えば済む話です。

numeric_chkが文字を受け取るのか、文字列を受け取るのか、仕様をはっきりさせてください。
C言語では両者の取り扱いが異なります。


また、インデントがぐちゃぐちゃです。
お手本となるようなコードを探して、できるだけ論理的階層にあったインデントを付けてください。

ex. else節はif節に対応しているのに、インデントレベルが違う。

投稿2019/04/22 03:24

編集2019/04/22 04:38
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2019/04/22 04:44 編集

それにしても、K&Rにホワイトスミスって... よほど拘りの強い教官なのですね。 せめて警告が出るところは現代のC言語に順応して欲しいように思います。
entio

2019/04/22 05:39

回答ありがとうございます。 おっしゃる通りscanf("%d←これが間違いでした。 文字列用の%sを使った結果正常に起動しました。 助かりました。
LouiS0616

2019/04/22 06:22

%sを使う場合snoを充分な領域を持ったchar配列の変数にする必要がありますが、その辺りは問題無いでしょうか。
entio

2019/04/23 00:55

そこの表記に問題がありました。 ありがとうございます。
guest

0

numeric_chk(&sno, 5); ← snoはcharなので1文字です?なぜ5個??
また、他の方も言われていますがインデントがおかしいです。
例えば、以下のように式の依存関係がひと目で分かるようにしましょう。

c

1int numeric_chk(char *str, int n) 2{ 3 for (int i = 0; i < n; i++) { 4 if ((str[i] >= '0') && (str[i] <= '9')) { 5 continue; 6 } else { 7 return -1; 8 } 9 } 10 return 0; 11}

また、

c

1 else 2 d=atol(&sno);else節にかかるのはこの行だけですが? 3 if (d==99999)←これも同じインデントになっている?

文字列(終端が\0)限定なら

c

1#include <stdio.h> 2#include <ctype.h> 3 4int numeric_chk(char *str) 5{ 6 while(*str){ 7 if(!isdigit(*str)){ 8 return -1; 9 } 10 str++; 11 } 12 return 0; 13} 14 15int main(void) 16{ 17 char num[] = "1234567890"; 18 int ret = numeric_chk(num); 19 printf("%d\n", ret); 20 // 21 return 0; 22}

で、いけます。

投稿2019/04/22 04:27

編集2019/04/22 05:48
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2019/04/22 04:43 編集

インデントの付け方等はソースで統一しましょう。また、無駄と思っても波括弧({})はつけるようにしましょう。あとで1行増やすとかした時にブロックから外れるときがありますよ。
guest

0

c

1#include <stdio.h> 2#include <string.h> 3int numeric_chk(char *str, int n) 4{ 5 int i; 6 for(i=0;i<n;i++) 7 { 8 if ((str[i]>='0')&&(str[i]<='9')) 9 continue; 10 else 11 return(-1); 12 } 13 return 0; 14} 15int main(int argc, char *argv[]) { 16 printf("%d\n", numeric_chk(argv[1], strlen(argv[1]))); 17} 18

試しに上記実行してみましたが思うように動いているように見えます。

mainでの呼び出しも貼ってもらえますか?

投稿2019/04/22 03:26

tetsunosuke

総合スコア1292

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問