【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.19758

文字列を数値に、そして分割する関数
投稿者---小丸(2005/02/06 17:28:42)


ある文字列(英単語)をASCII文字の数値(例えば小文字なら97〜122)に変換し、その数値を分割する関数を作ったのですが、実因数の型が不適当と出力されてしまいます。もしよろしければ、どうかご教授ください。
OSはWindows ME、コンパイラはUltra-Cです。
具体例:数値123456→12+34+56=102、または123+456=579などなど。
102や、579という数値を他の関数で利用したい。

unsigned int Change(char *buf)
{
    int a, b, k, value, value1;
    value=buf[0];
    for(k=1; k<strlen(buf); k++){
        value+=buf[k];
    sscanf("value", "%2d%2d", &a, &b);
    sscanf("%d+%d=%d\n", a, b, a+b);
    sscanf("value1", &a+b);
    }
    return(value1);
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:文字列を数値に、そして分割する関数 19759 KING・王 2005/02/06 17:44:37


No.19759

Re:文字列を数値に、そして分割する関数
投稿者---KING・王(2005/02/06 17:44:37)


> sscanf("value", "%2d%2d", &a, &b);
> sscanf("%d+%d=%d\n", a, b, a+b);
> sscanf("value1", &a+b);

sscanf()の第1引数がおかしいのでは?
sscanf()の仕様を確認して下さい。


この投稿にコメントする

削除パスワード

No.19760

Re:文字列を数値に、そして分割する関数
投稿者---小丸(2005/02/06 19:04:51)


>> sscanf("value", "%2d%2d", &a, &b);
>> sscanf("%d+%d=%d\n", a, b, a+b);
>> sscanf("value1", &a+b);
>
>sscanf()の第1引数がおかしいのでは?
>sscanf()の仕様を確認して下さい。


返信、ありがとうございます。
エラーが1つ減っただけで、変わらないですね。
unsigned int Change(char *buf)
{
    int a, b, k, value, value1;
    value=buf[0];
    for(k=1; k<strlen(buf); k++){
        value+=buf[k];
    sscanf("value", "%2d%2d", &a, &b);
    sscanf("%d+%d=%d\n", a, b, a+b);
    scanf("value1", &a+b);
    }
    return(value1);
}



この投稿にコメントする

削除パスワード

No.19761

Re:文字列を数値に、そして分割する関数
投稿者---HALLS(2005/02/06 19:26:06)


>>sscanf()の第1引数がおかしいのでは?
>>sscanf()の仕様を確認して下さい。

この回答に対して、3個目のsscanf()をscanf()に変えただけと
いうのはちょっとまずいと思います。



この投稿にコメントする

削除パスワード

No.19763

Re:文字列を数値に、そして分割する関数
投稿者---KING・王(2005/02/06 20:21:27)


>>>sscanf()の第1引数がおかしいのでは?
>>>sscanf()の仕様を確認して下さい。
>
>この回答に対して、3個目のsscanf()をscanf()に変えただけと
>いうのはちょっとまずいと思います。

MSDNですが、

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_crt_sscanf.2c_.swscanf.asp

でも参考にして、sscanfの使用方法に関して勉強して下さい。
サンプルも載っていますので。




この投稿にコメントする

削除パスワード

No.19764

Re:文字列を数値に、そして分割する関数
投稿者---小丸(2005/02/06 21:18:45)


返信ありがとうございます。
教ええてくださったサイトをくまなく見ても
自分のプログラムとどのように異なるのかがいまいち分かりません。
数値を分割する方法はわかっていて、出来るのですが、
題名にもあるように、文字列→数値→分割する方法になるとどのように工夫を
すればいいのか分かりません。
以下は、数値を分割する方法です。

#include <stdio.h>
int main()
{
int a, b;
sscanf( "数値(例:1234)", "%2d%2d", &a, &b );
printf( "%d + %d = %d\n", a, b, a + b);
return 0;
}



この投稿にコメントする

削除パスワード

No.19765

Re:文字列を数値に、そして分割する関数
投稿者---南野骨茶(2005/02/06 22:08:52)


>題名にもあるように、文字列→数値→分割する方法になるとどのように工夫を
>すればいいのか分かりません。

最終的に、分割した状態の数値を得たいのであれば、
まずは文字列を分割した後で各々の分割文字列を数値化する方が
わかりやすいのではないかと思います。


この投稿にコメントする

削除パスワード

No.19767

Re:文字列を数値に、そして分割する関数
投稿者---南野骨茶(2005/02/06 22:39:43)


>以下は、数値を分割する方法です。

このプログラムで、本当に正しく分割できるのでしょうか。
sscanf関数の第1引数が正しくないです。

例えば、
    char s[] = "1234";
    sscanf(s, "%2d%2d", &a, &b);

というようにすれば、aは12に、bは34になります。
sscanf関数を使うとすれば、こういう風なやり方になるはずです。


この投稿にコメントする

削除パスワード

No.19769

Re:文字列を数値に、そして分割する関数
投稿者---小丸(2005/02/07 00:16:18)


>>以下は、数値を分割する方法です。
>
>このプログラムで、本当に正しく分割できるのでしょうか。
>sscanf関数の第1引数が正しくないです。
>
>例えば、
>
    char s[] = "1234";
    sscanf(s, "%2d%2d", &a, &b);

>というようにすれば、aは12に、bは34になります。
>sscanf関数を使うとすれば、こういう風なやり方になるはずです。

正しく数値を分割して、加算しているんですが、
よくないのでしょうか?
プログラムを色々と変更していますが、
パニックになってしまって、エラーが多くなるばかりで困っています。


この投稿にコメントする

削除パスワード

No.19770

Re:文字列を数値に、そして分割する関数
投稿者---とおりすがり(2005/02/07 03:40:06)


>正しく数値を分割して、加算しているんですが、
>よくないのでしょうか?

あなたが「正しく出来た」と思っているだけで、出来ていないのでしょう。
加算とか余計なことは考えずに、まず正しく分割できているか確認して下さい。

正しく分割できたか否かは、直後のprintfの結果のaとbがどう出力されるかで
わかるはずです。
そこが正しく出力されていないのであれば、正しく分割できていないのです。


この投稿にコメントする

削除パスワード

No.19772

Re:文字列を数値に、そして分割する関数
投稿者---南野骨茶(2005/02/07 09:17:48)


>正しく数値を分割して、加算しているんですが、
>よくないのでしょうか?

一度、その関数の仕様を再整理なさってみてはいかがでしょうか。
どんな入力を与えたときにどんな出力を得ることを期待しているのでしょう。
入出力が明確になれば、入力をどう加工して出力するかという
関数の内部処理が見えてくると思います。


この投稿にコメントする

削除パスワード

No.19773

Re:文字列を数値に、そして分割する関数
投稿者---Craft(2005/02/07 11:30:46)


>正しく数値を分割して、加算しているんですが、
>よくないのでしょうか?
>プログラムを色々と変更していますが、
>パニックになってしまって、エラーが多くなるばかりで困っています。

ちょっと前のソースを引用しますが、
    for(k=1; k<strlen(buf); k++){
        value+=buf[k];
    sscanf("value", "%2d%2d", &a, &b);

value は文字配列ですが、"value"は文字定数です。
この違いを理解しましょう。

sscanfは文字列内の情報を指定した形で取り出すことができますが、文字定数"value"には"%2d%2d"に相当する情報がないので、この書き方をしている限り期待した結果は手に入らないです。

sscanfの使い方をよく理解した上で、printf()等でsscanf直後のa,bの値を随時表示するなどして、動きをみたほうがいいです。


この投稿にコメントする

削除パスワード

No.19775

Re:文字列を数値に、そして分割する関数
投稿者---円零(2005/02/07 12:55:04)


変数の値と変数名がごっちゃになってるようですね。

あなたが最初に書いたコードでは、例えばbufとして"value"が渡された場合に
for文の所で 118 + 97 + 108 + 117 + 101 = 541 を計算する形であり、
「具体例」と仕様が違うので何がやりたいのか判然としません。

ですがあえて指摘するなら、
・最初のsscanf、第一引数が"value"なので、int型の変数valueの中身ではなくて、
 たまたまその変数の名前と同じリテラル文字列"value"を読んでるに過ぎません。
 'v'も'a'も'l'も'u'も'e'も数字ではないので%dで読もうとしても無駄なことです。
・二番目のsscanf、表示させたいのならprintfでしょ?
・三番目のsscanf、数値を変数に代入するときは代入演算子を使ってください。
 sscanfは文字列からデータを読み取るものです。足し算の結果は数値であって文字列ではありません。


この投稿にコメントする

削除パスワード

No.19778

Re:文字列を数値に、そして分割する関数
投稿者---小丸(2005/02/07 22:14:20)


みなさん、返信ありがとうございます。
色々と試行錯誤した結果、以下のようなプログラムを作りました。
一応、エラーなどは出ませんが、
工夫したほうが良い。また、これではダメだというところがありましたら
指摘や訂正などをお願いいたします。

unsigned int Change(char *buf)
{
    unsigned int n, length, value, weight, value1, a, b;
    length=strlen(buf);
    for(n=weight=value=0; n<length; ++n, ++weight){
        if(weight>7)
            weight=0;
        value+=(int)buf[n]<<(4*weight);
        a=floor(value/100);
        b=value-(a*100);
    }
    value1=(a+b)/997;
    return(value1%table);
}



この投稿にコメントする

削除パスワード

No.19779

Re:文字列を数値に、そして分割する関数
投稿者---南野骨茶(2005/02/07 22:25:21)


>色々と試行錯誤した結果、以下のようなプログラムを作りました。

997という謎の数値の意味合いや、table変数の値がわかりませんので、
現時点では検証しきれません。

内部処理の説明や入出力のサンプルもあると、より確認しやすくなると思います。


この投稿にコメントする

削除パスワード

No.19780

Re:文字列を数値に、そして分割する関数
投稿者---shu(2005/02/07 22:48:28)


いわゆる『ハッシュ関数』をつくろうとしているのかな?


この投稿にコメントする

削除パスワード

No.19781

Re:文字列を数値に、そして分割する関数
投稿者---小丸(2005/02/07 23:05:18)


南野骨茶さん、shuさん返信ありがとうございます。
そうですね、ハッシュ関数を作ろうと思ってます。
997の数値はあってもなくてもよいですね。
なんか今までにないハッシュ関数を作らなきゃいけないので色々と試行錯誤しています。
表のサイズは5000ですね。そこにデータを格納するという感じです。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧