No.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;
}
この回答へのお礼
お礼日時:2010/01/16 20:19
返事が遅くなりすいません。
自力でなんとかできました。
書いていただいたプログラムとはやり方が異なりますがた大変参考になります。
ありがとうございます
No.7
- 回答日時:
> 一般電話の電話番号は
> (0S)Kkkk-nnnn
> (0SS)Kkk-nnnn
> (0SSS)Kk-nnnn
> (0SSSS)K-nnnn
> の形になります。
残念。(0SSSSS)-nnnn の地域もありますよ。
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電話の番号を入力出来るようにしようとすると、条件がもっと複雑になります。
まずは「すべてのパターンを洗い出すこと」です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- C言語・C++・C# c言語で自然数nを入力、2以上n以下の偶数の累積sumを求めるプログラムをfor文を使って作りたいで 4 2022/11/09 14:10
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Java Java 南京錠 2 2023/02/04 11:46
- Visual Basic(VBA) 【再々投稿】VBAのプログラムで動作しなくて困っています 8 2022/10/14 09:06
- その他(プログラミング・Web制作) プログラミングについて(Python) 添付した画像はC言語で簡単に作ったソースで、1つの配列に5つ 3 2022/09/10 19:15
- C言語・C++・C# C#の問題です。 文字列型の配列 s[100] にキーボードから入力された100文字以内の文字列(単 2 2022/06/22 15:18
- C言語・C++・C# c言語について array[i]-‘0’ これってどーゆー意味ですか? (ちなみに16進数を10進数 5 2022/12/06 18:39
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# C言語 3 2022/10/04 15:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
スタックポインタを使って,1...
-
C言語について
-
文字列から空白を取り除きたい...
-
C言語 スタック pop-up
-
8進数と16進数で表示するプロ...
-
atoi( ) の反対をやりたい
-
c++ 文字列を入力して、一文字...
-
間接参照のレベルが異なっています
-
C言語のfor文です。 繰り返しの...
-
構造体の各メンバにfor文からア...
-
C言語の入力した文字を反転させ...
-
wParam
-
switch文で文字を比較すること...
-
WORDをcharに変換する方法
-
【C言語】文字型と整数型の違い
-
干支のプログラム
-
文字を16進変換
-
double型の値をchar配列に変換...
-
PING JPEGファイルのExif規格の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
c++ 文字列を入力して、一文字...
-
CStringをwchar_tに変換したい
-
switch文で文字を比較すること...
-
干支のプログラム
-
絶対パスからのファイル名の切...
-
3桁区切(コンマ)記号をつけ...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
【C言語】文字型と整数型の違い
おすすめ情報