• ベストアンサー

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です。 エラー処理は適切に行なってください。

  • chie65535
  • ベストアンサー率43% (8520/19368)
回答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

  • C言語プログラム

    C言語プログラム ある数を入力して、入力された数を一辺とする図形を描くプログラムを作りたいんです。 分かりやすくすると、 入力された数が5だった時、画面には ***** ***** ***** ***** ***** ↑こう出力させたいんです。 四角だけじゃなくて、 * ** *** **** ***** ↑こういう三角とか、逆三角とか、 *        * **     *** ***  ***** **     *** *        * こんなかんじでいろんな形を描けるようにしたいんです。 C言語で、for文の二重ループを使うようにとのことなんですが、 どうすればいいでしょうか。 こういうのってズルですけど、何かヒントでも貰えればと思っています...。

  • c言語

    c言語で自然数nを入力、2以上n以下の偶数の累積sumを求めるプログラムをfor文を使って作りたいです。 教えていただきたいです。

  • C言語のプログラムの質問です

    C言語で負の値が入力されたときに処理を終了する条件でキーボードから繰り返し入力するためにはどのようなプログラムにしたらいいですか? (FOR文を使い、FOR文の繰り返し条件を入れないで繰り返す)

  • c言語です

    c言語初心者です。今大学の課題でc言語のプログラムをかいているのですが、うまくいかないので助けて欲しいです。以下のようなプログラムで調和平均の値を出したいのですがなぜか表示されません。infと表示されてしまいます。あと調和平均とはn/(1/d1+1/d2+1/d3+.........+1/dn)の値です。ここでd1~dnは入力された数のことです。なので0が入力された場合は値を返さないようにしたいです。   どこをどのように直せばいいのか教えてください。よろしくお願いします。 #include <stdio.h> #include<math.h> #define M 1000 int main (int argc, const char * argv[]) { // insert code here... float d[M]; double e[M]; double wa=0.0,av,bun=0,kika=1,tyowa=0; /*avはaverageを,bunは分散を意味します*/ int i=0,j=0; printf("複数の数字を入力してください\n"); printf("数字入力を終了するときはnull文字を入力してください\n"); printf("数字以外が入力されたら\n"); printf("それまでの数字の計算結果を表します\n"); /*数字を入力、和を求める*/ while (scanf("%f",&d[i])!='\0') { wa=wa+d[i]; i++; } if (i!=0) { printf("算術平均は%fです\n",wa/i); av=wa/i; for (j=0; j<i; j++) { kika=kika*d[j]; } printf("幾何平均は%fです\n",pow(kika,1./i)); for (j=0; j<i; j++) { if (d[j]=0) { printf("調和平均は出せません\n"); } else e[j]=1/d[j]; } for (j=0; j<i; j++) { tyowa=tyowa+e[j]; } printf("調和平均は%fです\n",e[1]); for (j=0; j<i; j++) { bun=bun+(d[j]-av)*(d[j]-av); } printf("分散の値は%fです\n",bun/i); } else { printf("数字を入力してください\n"); } return 0; }

  • C言語のアルゴリズムについて

    C言語で「標準入力から英語の文章を読み込んで,文字列Ilmorが出現した行をその行番号とともに表示するプログラムを作りなさい.」とプログラムを作りたいのですが、文字列を発見するところまでは分かるのですが、その行どうやって表示すればいいのか分かりません。また、文章を読み込むのもすごくややこしく最後にエンターを二回押すなどの制限があります。(scanf) 参考になるプログラムを書いていただける方いませんか?できればC言語のアルゴリズムについて詳しく書いた本やサイトがあれば教えていただきたいです。 レベルは超入門的な本を2,3冊読んだ程度です。アルゴリズムなどにはまったく触れてなかったし、ライブラリー関数も少ししか載ってなかったので関数の本もあれば教えていただきたいです。

  • ★C言語の問題です★

    C言語のプログラムの問題なんですが、どなたか以下の問題の1問でも解ける方がいればご回答おねがいします! または、アドバイスだけでもいいのでよろしくお願いします。 【問題】 1 西暦1868年から2007年までの年号を入力して和暦に変更して出力するプログ  ラムを作成するプログラム。  例 入力 1868  出力 明治元年       2007     平成19年 2 整数配列が-32768から32767の範囲の数しか扱えないとしたとき、10桁の整数同士  の足し算を行うプログラム。 3 3桁の整数の値を入力していき、-9999が入力されたところで、それまでに入力  された数の個数と合計を整数で、平均を浮動小数点数で出力するプログラム。 4 3つの文字列”Happy”と“New”と“Year”をつないで1つの文字列として出力する  プログラム。 5 学籍番号、氏名、出席からなる10人分のデータがある。出席の悪いものから並び替  えて表示するプログラム。  例  CA180002 山田太郎 70  CA170001 山田次郎 60  データは、適当なものを使います。

  • C言語の授業で

    C言語の授業で -------------------- 3以上の整数を入力してください:10 素数は以下の数です: 7 5 3 2 素数は4個ありました -------------------- という感じの、入力した数以下の素数を表示するプログラムをwhile文を用いて作成するように言われたんですが・・・。 まず、while文と素数を表示するプログラムがよくわからないので、もう何をすればいいのか・・・。 どうか、ご教授お願いします。

  • C言語のプログラミングについてです><

    今C言語のプログラミングの勉強をしているのですが、わからないプログラムがでてきたので教えてくださる方がいらっしゃれば、ご教授願いたいです。 数当てゲームの作成 1~9(0は除く)のなかから4つの異なる数字をランダムで選択し、4桁の数をつくる。ユーザは4つの数字の並びを入力して、作られた数を当てる。 ユーザの入力した数と作られた数を比較して、同じ数字が同じ桁にある場合は"Hit"というヒントを与える。また、同じ数字が異なる桁にある場合は"Blow"というヒントを与える。すなわち、作られた数が5849で、ユーザが4829という数値を入力した場合、"2 Hit 1 Blow"というヒントが表示されるようにする。 ユーザは10回まで、入力するチャンスが与えられる。 といった感じのプログラミングなんですが、C言語初心者である自分にはまったくわかりません; ; どなたかわかる方がいらっしゃれば、助けていただけないでしょうか?よろしくお願いします!

  • C言語で分からないことがあり、投稿しました。

    C言語で分からないことがあり、投稿しました。 ユーザから2から100までのいずれかの整数を受け取り、1からその数までの総和を計算するプログラムをfor文を使って書け。利用者が範囲外の数値を入力した場合、「値が範囲内にありません」などのエラー表示を行え。ただし、ユーザ定義の関数を1つ使うこと。(ここではfunc1に統一) もしよろしければ、アドバイスいただけると幸いです。

  • C言語の問題

    配列の問題 1.キーボードから入力したアルファベットの大文字(A~Z)の入力回数をそれぞれ数え、結果を画面出力するプログラムを作成せよ。但し、入力の終了はEOFとし、入力回数のカウントには、配列を用いるものとする。(文字ごとに回数を格納する配列を用意する) 2.キーボードから番号(数字)を入力し、その番号に該当する文字列中の文字を画面表示するプログラムを作成せよ。なお、数字以外の文字が入力した場合と、文字列の範囲外の数字が入力された場合は、任意のメッセージを出力し、再入力するようにする。また文字列はキーボードから入力するものとする。 この問題が解けなくて困ってます。どうか知恵をかしてください。

専門家に質問してみよう