C言語関係掲示板

過去ログ

No620 メール機能のプログラム

[戻る] [ホームページ]
No.6184

メール機能のプログラム
投稿者---shta(2003/05/09 16:48:11)



考え方だけでもいいので、教えてください。
どこから手をつけてよいかわかりません。
次のような問題です。
ショートメール機能に使われている、数字と文字を対応させた
対応表を使用して文字列を入力して対応する2桁の数字を出力するプログラム
を作ってください。また数字を入力して対応する文字を表示するプログラムを
つくってください。
入力可能な文字の長さは0〜100文字とし、表に対応する文字がない場合
には何も表示しない。予め用意されているヘッダファイル"table.h"を
使用する。対応表は次のような感じです。
       2桁目
      0123456789
1桁目 0あいうえおABCDE
     1かきくけこFGHIJ
     2さしすせそKLMNO
     3たちつてとPQRST
     4なにぬねのUVWXY
     5はひふへほZ?!−/
     6まみむめも¥&
     7や(ゆ)よ*#
     8らりるれろ12345
     9わをん゛゜67890

以下はヘッダファイルをしめしています。

#define MAX_X 10
#define MAX_Y 10

const char *tbl[MAX_X][MAX_Y]=
{
{"ア","イ","ウ","エ","オ","A","B","C","D","E"},
{"カ","キ","ク","ケ","コ","F","G","H","I","J"},




c言語は初心者です。いま考えているのはargvで読み込んだ文字列をstrchrをつかって
検索して見つけ出しヘッダファイルの数字を取り出すのではないかなと。後は配列
を使って数字を取り出すのかな。
1からプロラムをつくったことがないのでまったく手が出ません。
元となるプログラムでもよいのでおしえてください。




No.6187

Re:メール機能のプログラム
投稿者---shta(2003/05/09 18:30:02)


補足なのですが、例を示しておきます。
例)「あさめし」と入力すると「11317432」と出力する
例)「11317432」 と入力すると「あさめし」と出力する。





No.6203

Re:メール機能のプログラム
投稿者---あかま(2003/05/10 17:40:17)


>補足なのですが、例を示しておきます。
>例)「あさめし」と入力すると「11317432」と出力する
>例)「11317432」 と入力すると「あさめし」と出力する。
ツッコミを入れると。
この入力仕様だと「11317432」と入力したら「85858785…」と出力されるはずです。
それも恐らく、「85858785…」の間違いです。

入力の全角半角の仕様がいいかげんな気がします。
そこのところをきちんと書かないとこのプログラムは書けないでしょう。

半角数字列の入力→全角文字列の出力
全角文字列の入力→半角数字列の出力

テーブル内の文字は全て全角

でいいのかな?

No.6206

Re:メール機能のプログラム
投稿者---あかま(2003/05/10 19:06:06)


argvから半角数字を入力した時を作ってみました。
動かしてないので、うまくいくかわかりませんが。

char *c;

c = argv[1];

while(*c != '\0' && *(c+1) != '\0'){
	printf("%s",tbl[*c-'0'][*(c+1)-'0']);
	c += 2;
}


これだと数字以外の入力があったとき、tbl外を参照してしまうので、
対策を施してください。

全角文字列から数字に変換する場合ですが
>いま考えているのはargvで読み込んだ文字列をstrchrをつかって
>検索して見つけ出しヘッダファイルの数字を取り出すのではないかなと。
strchrだと文字列から1文字を見つけるだけですから、
テーブルから見つけ出すことはできないし、文字列(全角は半角2文字なので1字でも文字列扱いです)を見つけ出すこともできません。

この場合はひたすらテーブル要素の1番目から比較していってはいかが?
比較するとき全角はあくまで2文字扱いなのをお忘れなく。

No.6241

Re:メール機能のプログラム
投稿者---shta(2003/05/12 08:59:50)


ありがとうございます。やってみます。

No.6245

Re:メール機能のプログラム
投稿者---shta(2003/05/12 12:07:55)


少し考えてみたのですが、途中の部分だけですが、どうでしょうか?r=strncmp(const char *tbl,argv[1][i],size 2); /*比較*/
if(r==0)
{
d=atoi(*argb[1][i]); /*文字列を数字に変換*/
printf("%d",d);
}
いかがでしょうか?


No.6270

Re:メール機能のプログラム
投稿者---あかま(2003/05/12 20:25:12)


>r=strncmp(const char *tbl,argv[1][i],size 2); /*比較*/
strncmpを使うのはよいと思います。ただこれだとtblの初めから2文字を比べるだけですのでちょっと違う。

> d=atoi(*argb[1][i]); /*文字列を数字に変換*/
これはargv[1][i]に入っている文字を数字に変換しています。
ですからtblに割り振られた値ではないですね。

↓strncmpを使って文字列→数字変換を書いてみました。
入力に1バイト文字が含まれるとうまく動きませんが。

#include <stdio.h>
#include <string.h>
#define MAX_X 2
#define MAX_Y 10

char *tbl[MAX_X][MAX_Y]=
{
{"ア","イ","ウ","エ","オ","A","B","C","D","E"},
{"カ","キ","ク","ケ","コ","F","G","H","I","J"}
};

int main(int argc,char *argv[]){
	
int i,j,flg;
char *c;

c = argv[1];
while(*c != '\0'){
	for(i = 0;i < MAX_X;i++){
		for(j = 0;j < MAX_Y;j++){
			flg = strncmp(tbl[i][j],c,2);
			if(flg == 0){
				printf("%s=%d%d\n",tbl[i][j],i,j);
				break;
			}
		}
		if(flg == 0)
		break;
	}
	c += 2;
}
}


No.6290

Re:メール機能のプログラム
投稿者---shta(2003/05/13 14:48:43)


ありがとうございます。やってみます。また分からなくなったら宜しくお願いします。

No.6296

Re:メール機能のプログラム
投稿者---shta(2003/05/13 15:53:15)


プログラムはほぼできあがりました。
しかしすこし変えて

printf("%s=%d%d\n",tbl[i][j],i,j);
のところを
printf("%s=%d%d\n",tbl[i][j],i+1,j+1);
として、
入力は「6アスワ」とすると、出力が
6=06
ア=11
ス=33
ワ=00としたいのですが、
6=106
ア=11
ス=33
ワ=1010
となってしまいます。
どうしたらよいのでしょうか?

No.6297

Re:メール機能のプログラム
投稿者---shta(2003/05/13 16:02:24)


対応表が以前のはまちがっていました。

1 2 3 4 5 67890
1アイウエオABCDE
2
3
4
5
6
7
8
9
0ワヲン゛゜67890

全て半角です。

No.6317

Re:メール機能のプログラム
投稿者---あかま(2003/05/13 21:44:41)


>全て半角です。
半角の方が簡単です。文字→数字がこれ。

#include <stdio.h>
#include <string.h>
#define MAX_X 2
#define MAX_Y 10

char tbl[MAX_X][MAX_Y]=
{
{'ア','イ','ウ','エ','オ','A','B','C','D','E'},
{'カ','キ','ク','ケ','コ','F','G','H','I','J'}
};

int main(int argc,char *argv[]){
	
int i,j;
char *c;


for(c = argv[1];*c != '\0';c++){
	for(i = 0;i < MAX_X;i++){
	for(j = 0;j < MAX_Y;j++){
		if(tbl[i][j] == *c){
			printf("%c=%d%d\n",tbl[i][j],i,j);
			goto OUT;
		}
	}
	}
	OUT:
}
}


数字→文字はがんばってみてください。

No.6453

Re:メール機能のプログラム
投稿者---shta(2003/05/16 17:18:16)


ありがとうございました。
数字→文字もできあがりました。