• ベストアンサー

c言語です。

c言語です。 現在電話番号入力のプログラムを書いているのですが、うまくいきません。 決まりは18文字以下で、入力できる値が数字1から9と'(',')','-'のみです。 私はあと少しなんですが、うまくプログラムを組めませんでした。 forを使ってやってみたのですがうまくいきません。文字数制限はできたのですが、、 どなたか良い知恵がありましたら教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.8

期待に添えるかどうかわかりませんが...。 #include <stdio.h> #include <string.h> #define SIZE 64 #define MAX 18 #define ERR_COMMENT "もう一度、入力して下さい。" /* プロトタイプ宣言 */ char *input_telphonenum(char *, char *); int main(void) { char buffer[SIZE]; /* ループ脱出:「return」key only */ input_telphonenum("電話番号は ..(..)... ? ", buffer); while (*buffer != '\0') { printf("\t電話番号: %s\n", buffer); input_telphonenum("電話番号は ..(..)... ? ", buffer); } return 0; } char *input_telphonenum(char *comment, char *data) { char *temp, *base; int c, flag, n; do { printf("%s", comment); temp = fgets(data, SIZE, stdin); temp = base = data; while (*temp == ' ') temp++; if (temp != base) { // 空白分を詰める while (*base++ = *temp++); temp = data; } n = 0; while ((c = *temp++) != '\0') { /* 許容電話番号: 0~9, (, ), -, \n, 18文字以内 */ flag = ((c >= '0' && c <= '9' || c == '(' || c == ')' || c == '-' || c == '\n') && n <= MAX) ? 0 : -1; if (flag != 0) { temp = data; while (*temp != '\n') temp++; *temp = '\0'; printf("\t%s: %s\a\n", data, ERR_COMMENT); break; } n += 1; } } while (flag != 0); *(temp - 2) = '\0'; // \n を削除 return data; }

armpoint
質問者

お礼

返事が遅くなりすいません。 自力でなんとかできました。 書いていただいたプログラムとはやり方が異なりますがた大変参考になります。 ありがとうございます

その他の回答 (7)

  • junkUser
  • ベストアンサー率56% (218/384)
回答No.7

> 一般電話の電話番号は > (0S)Kkkk-nnnn > (0SS)Kkk-nnnn > (0SSS)Kk-nnnn > (0SSSS)K-nnnn > の形になります。 残念。(0SSSSS)-nnnn の地域もありますよ。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.6

> 1から9は半角のみです。書き間違えました。 だったら話は簡単です。 scanf系の関数で、"%18[123456789()-]"の書式を使えばOKです。 エラー処理は適切に行なってください。

回答No.5

一般電話の電話番号は (0S)Kkkk-nnnn (0SS)Kkk-nnnn (0SSS)Kk-nnnn (0SSSS)K-nnnn の形になります。 上記のうち ・(と0と)と-はそのまま ・Sは「1~9」 ・Kは「2~9」 ・kは「1~9」 ・nは「0~9」 となります。 これは ・市外局番は0で始まり、0があるのは先頭のみ ・市内局番は2~9で始まり、途中に0は出て来ない と言う規則があるからです。 この規則は「市外局番と市内局番の区切りを変えて、市内局番を増やす場合」に、問題が出ないようにする為です。 この他、フリーダイヤル、携帯電話、IP電話の番号を入力出来るようにしようとすると、条件がもっと複雑になります。 まずは「すべてのパターンを洗い出すこと」です。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

あれ? この仕様であってる? 「電話番号」だと, 0 も入らないとまずいんじゃぁ....

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

1から9は全角でしょうか? その場合、少なくとも文字コードを明らかにしないと実現できません。 また、18文字以下とのことですが、全角文字は1文字と数えるということでよいのでしょうか?

armpoint
質問者

補足

1から9は半角のみです。書き間違えました。 すいません。

  • junkUser
  • ベストアンサー率56% (218/384)
回答No.2

正規表現でやってはいかがでしょうか。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「あと少し」ということは「だいたいできている」ということだよね. 今のプログラムを見せてもらえませんか?

armpoint
質問者

お礼

返事が遅くなりすいません。 自力でなんとかできました。

関連するQ&A