プロが教えるわが家の防犯対策術!

c言語です。
現在電話番号入力のプログラムを書いているのですが、うまくいきません。
決まりは18文字以下で、入力できる値が数字1から9と'(',')','-'のみです。

私はあと少しなんですが、うまくプログラムを組めませんでした。

forを使ってやってみたのですがうまくいきません。文字数制限はできたのですが、、

どなたか良い知恵がありましたら教えてください。

A 回答 (8件)

期待に添えるかどうかわかりませんが...。




#include <stdio.h>
#include <string.h>
#define SIZE64
#define MAX18
#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;
intc, 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;
}
    • good
    • 0
この回答へのお礼

返事が遅くなりすいません。

自力でなんとかできました。

書いていただいたプログラムとはやり方が異なりますがた大変参考になります。

ありがとうございます

お礼日時:2010/01/16 20:19

> 一般電話の電話番号は


> (0S)Kkkk-nnnn
> (0SS)Kkk-nnnn
> (0SSS)Kk-nnnn
> (0SSSS)K-nnnn
> の形になります。

残念。(0SSSSS)-nnnn の地域もありますよ。
    • good
    • 0

> 1から9は半角のみです。

書き間違えました。

だったら話は簡単です。
scanf系の関数で、"%18[123456789()-]"の書式を使えばOKです。
エラー処理は適切に行なってください。
    • good
    • 0

一般電話の電話番号は


(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電話の番号を入力出来るようにしようとすると、条件がもっと複雑になります。

まずは「すべてのパターンを洗い出すこと」です。
    • good
    • 0

あれ? この仕様であってる?


「電話番号」だと, 0 も入らないとまずいんじゃぁ....
    • good
    • 0

1から9は全角でしょうか?


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

この回答への補足

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

すいません。

補足日時:2010/01/12 09:53
    • good
    • 0

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

    • good
    • 0

「あと少し」ということは「だいたいできている」ということだよね.


今のプログラムを見せてもらえませんか?
    • good
    • 0
この回答へのお礼

返事が遅くなりすいません。

自力でなんとかできました。

お礼日時:2010/01/16 20:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!