ページ 11

C言語 文字列判別

Posted: 2008年11月13日(木) 17:27
by 入門レベル
文字列の中の判別がよくわからなくて困っております。例えば一文字入力しそれが数字ならば「数字です」と表示する

ような一文字を判別するプログラムならば容易くできます。これが一行になると端から1つ1つ見ていくプログラムが

必要になり、ファイルの中の数字を判別するとなるとさらにファイルから読み込む作業は必要になりますよね。


質問はお2つです。
①私は22日にその2冊の本を200円で買ったという文字列があったとしますと、

例えばこの文字列から数字だけ取り出すとして、
順に一文字ずつ読み込んでいって数字があればそこから次に数字以外の文字が現れるまでを範囲とし
取り出すという方法が思いつきますがどのようなプログラムになるのでしょうか。

※1文字ずつ読み込んで1つ1つ分けていくという方法を過去スレでも拝見しましたがそれではなく
範囲で取り出す方法を知りたいと思います。
表示の仕方は
22
2
200でも
22,2,200でも構いません。


②これをファイル全体で行うとするとどういうプログラムになるのか

です。教えてください。

※使用言語はC言語です。

Re:C言語 文字列判別

Posted: 2008年11月13日(木) 17:51
by たかぎ
> ①私は22日にその2冊の本を200円で買ったという文字列があったとしますと、
> 例えばこの文字列から数字だけ取り出すとして、

拡張文字集合が混在している文字列に対する判別は規格厳密合致プログラムでは不可能です。
処理系とロケールの特定が必要になります。

まずは、http://dixq.net/board/board.htmlを熟読して、必要な情報を提供してください。

Re:C言語 文字列判別

Posted: 2008年11月13日(木) 17:59
by 入門レベル
>> ①私は22日にその2冊の本を200円で買ったという文字列があったとしますと、
> 例えばこの文字列から数字だけ取り出すとして、

拡張文字集合が混在している文字列に対する判別は規格厳密合致プログラムでは不可能です。
処理系とロケールの特定が必要になります。

したらば
ABCDE22HIJK2LKJMJG200GHBという文字列を考えます。


>>まずは、規約を熟読して、必要な情報を提供してください。
書く前に2,3回は目を通しております。

Re:C言語 文字列判別

Posted: 2008年11月13日(木) 18:04
by Mist
> 書く前に2,3回は目を通しております。

だったら、テンプレにある項目ぐらい記載してもらえませんか?

Re:C言語 文字列判別

Posted: 2008年11月13日(木) 18:12
by non
範囲で取り出す方法という意味がわかりませんが、1文字ずつチェックしたらなぜいけないのですか?

Re:C言語 文字列判別

Posted: 2008年11月13日(木) 18:15
by 入門レベル
どの項目でしょうか?
規約に書かれている順番どおりに書くと
1:記載済み
2,3:構成すらわからないのでまだ未製作、考え方のみイメージした所です。
4,質問①、②に当たります。
5,習いたてです。文法を一通り習った程度です。

環境はC言語
VisualC+2008です。

5と使用コンパイラ以外は記載していると思います。
ご不明な点があれば何がわからないのかをご指摘ください

Re:C言語 文字列判別

Posted: 2008年11月13日(木) 18:19
by 入門レベル
例えば最初の22を取り出すときに2,2と取り出して隣合わせて置いたとしても22なのはそう見えるだけで
機械は2を2個と判断してしまうと思います。このプログラムは次の図形描写に使うのです。1文字ずつチェックなのは
いいのですが取り出し方がまずいんじゃないかなと思います。

Re:C言語 文字列判別

Posted: 2008年11月13日(木) 18:28
by たかぎ
> ABCDE22HIJK2LKJMJG200GHBという文字列を考えます。

それなら、strcspnとstrspnを組み合わせればよいだけかと思います。
全角数字など、拡張文字集合は扱わないんですよね?
拡張文字集合を扱うのであれば、ワイド文字列として入力して、wcscspnとwcsspnを使ってください。
ロケールの設定をお忘れなく。

Re:C言語 文字列判別

Posted: 2008年11月13日(木) 18:30
by Mist
int main(void){
    printf("2");
    printf("2");
    printf("\n");

    return  0;
}

int main(void){
    printf("22");
    printf("\n");

    return 0;
}
実際はファイルにでも書きだすべきでしょうが、あなたのいうところの機械とやらは上のプログラムで
出力される「22」と下のプログラムで出力される「22」が違うものと判断できるということでしょうか?

Re:C言語 文字列判別

Posted: 2008年11月13日(木) 18:32
by Dixq (管理人)
「200冊ありますよ」という文字列を対象にしているのであって
「200冊ありますよ」という文字列からは200を数字として取り出さなくていいのですね?

Re:C言語 文字列判別

Posted: 2008年11月13日(木) 18:35
by 入門レベル
半角と全角では大幅にやり方が異なるということをさっきしりましたので数字は半角限定にしてください。
申し訳ありません。

Re:C言語 文字列判別

Posted: 2008年11月13日(木) 18:37
by 入門レベル
そのように聞いています。>Mistさん

Re:C言語 文字列判別

Posted: 2008年11月13日(木) 18:40
by non
使い方が限定されますが、このようなことでしょうか?
#include <stdio.h>
#include<stdlib.h>
#include <ctype.h>
int main(void)
{
	char *str="ABCDE22HIJK2LKJMJG200GHB";
	char s[10],*s1;
	while(*str!='\0'){
		if(isdigit(*str)){
			s1=s;
			while(*str!='\0' && isdigit(*str))
				*s1++=*str++;
			*s1='\0';
			printf("%d\n",atoi(s));
		}
		else
			str++;
	}
	return 0;
}

Re:C言語 文字列判別

Posted: 2008年11月13日(木) 19:01
by Mist
一文字ずつ処理してみました。
#include    <stdio.h>
#include    <stdlib.h>
#include    <ctype.h>

int main(void)
{
    char *str="ABCDE22HIJK2LKJMJG200GHB";
    long tmp;
    int  flg;

    tmp = 0;
    flg = 0;
    while (*str != '\0') {
        if (isdigit(*str)) {
            tmp = tmp * 10;
            tmp += (*str - '0');
            flg = 1;
        } else {
            if (flg) {
                printf("%d\n", tmp);
                tmp = 0;
                flg = 0;
            }
        }

        str++;
    }
    return 0;
}

Re:C言語 文字列判別

Posted: 2008年11月13日(木) 19:05
by Mist
最後が数字で終わってると出力されないバグがあったのでちょっと修正。
#include    <stdio.h>
#include    <stdlib.h>
#include    <ctype.h>

int main(void)
{
    char *str="ABCDE22HIJK2LKJMJG200";
    long tmp;
    int  flg;

    tmp = 0;
    flg = 0;
    while (*str != '\0') {
        if (isdigit(*str)) {
            tmp = tmp * 10;
            tmp += (*str - '0');
            flg = 1;
        } else {
            if (flg) {
                printf("%d\n", tmp);
                tmp = 0;
                flg = 0;
            }
        }

        str++;
    }
    if (flg) {
        printf("%d\n", tmp);
    }
    return 0;
}

Re:C言語 文字列判別

Posted: 2008年11月13日(木) 19:08
by 入門レベル
少し時間かけて分析してみます。よろしければ②の方も教えていただけませんか?
行のみだと
char *str="ABCDE22HIJK2LKJMJG200GHB";とできますがファイルからだと使えないですよね。
その辺がまだよくわからなくて・・・

Re:C言語 文字列判別

Posted: 2008年11月13日(木) 19:15
by たかぎ
#include <stdio.h>
#include <string.h>

int main(void)
{
  const char str[/url] ="ABCDE22HIJK2LKJMJG200GHB";
  const char d[/url] = "0123456789";
  size_t i;
  for (i = strcspn(str, d); i < sizeof(str)-1; i += strcspn(str + i, d))
  {
    size_t j = strspn(str + i, d);
    printf("%.*s\n", j, str + i);
    i += j;
  }
  return 0;
}
↑で済む話だと思いますが...

Re:C言語 文字列判別

Posted: 2008年11月13日(木) 19:28
by Mist
ファイルの場合、char *strがFILE *fpになって、終了判定をEOFでチェックしましょう。
自分で作ってみてうまくいかなかったらまた質問してください。

Re:C言語 文字列判別

Posted: 2008年11月13日(木) 19:34
by たかぎ
> ファイルの場合、char *strがFILE *fpになって、終了判定をEOFでチェックしましょう。

それほど大きくない(メモリに収まりきる程度の)ファイルであれば、いったん配列に読み込んでしまえば、あとは文字列として扱えますね。

Re:C言語 文字列判別

Posted: 2008年11月13日(木) 20:18
by non
行単位で読めば、同じですが。
ただし、1行を100文字以内にしました。
FILE *fp;
	char *str,str1[100];
	char s[10],*s1;
         ファイルオープン
	while(fgets(str1,100,fp)!=NULL){ 行単位で読む
		str=str1;
         前のプログラムをそのままここに書く

	}

Re:C言語 文字列判別

Posted: 2008年11月13日(木) 20:42
by 入門レベル
ありがとうございました。考えてわからなかったらまたご質問します

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 09:39
by 入門レベル
include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
FILE *fp; 
char *str,str1[100];
char s[10],*s1;



if ((fp = fopen("memo.txt", "r")) == NULL) {
printf("file open error!!\n");
return EXIT_SUCCESS;
}

while (fgets(str1, 100, fp) != NULL) {
str=str1;
while(*str!='\0'){
		if(isdigit(*str)){
			s1=s;
			while(*str!='\0' && isdigit(*str))
				*s1++=*str++;
			*s1='\0';
			printf("%d\n",atoi(s));
		}
		else
			str++;
	}
         fclose(fp);
}
	return 0;
}
とすると
ビルドエラーはでないのですが
Debug Assertion Failed
File:fgets.c
Line:60
Expression:str!=NULL


と出て実行できません。
どこが間違ってるのでしょうか

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 10:03
by non
段下げを、正確にする癖をつけましょう。
1行目、#がない。これは、おそらくコピーミス。
fcloseの場所が悪い。
段下げを正確にしないから、場所を間違えます。

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 10:55
by 入門レベル
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
FILE *fp; 
char *str,str1[100];
char s[10],*s1;



if ((fp = fopen("memo.txt", "r")) == NULL) {
printf("file open error!!\n");
return EXIT_SUCCESS;
}

while (fgets(str1, 100, fp) != NULL) {
str=str1;
while(*str!='\0'){
		if(isdigit(*str)){
			s1=s;
			while(*str!='\0' && isdigit(*str))
				*s1++=*str++;
			*s1='\0';
			printf("%d\n",atoi(s));
		}
		else
		str++;
	}
         }
         fclose(fp);

	return 0;
}

うーん、これだと思ったのですが同じ結果です。
段下げは今始めて聞いたので・・
勉強しておきます

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 11:13
by やそ
字下げ(インデント)だけ空白2文字でそろえてみたつもり・・・
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
  FILE *fp; 
  char *str,str1[100];
  char s[10],*s1;



  if ((fp = fopen("memo.txt", "r")) == NULL) {
    printf("file open error!!\n");
    return EXIT_SUCCESS;
  }

  while (fgets(str1, 100, fp) != NULL) {
    str=str1;
    while(*str!='\0'){
      if(isdigit(*str)){
        s1=s;
        while(*str!='\0' && isdigit(*str))
          *s1++=*str++;
        *s1='\0';
        printf("%d\n",atoi(s));
      }
      else
        str++;
    }
  }
  fclose(fp);
  return 0;
}
さあ、考えてみよう^^

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 11:22
by non
入門レベルさんへ
fcloseの位置はよくなりました。動くはずですが・・・?
前と、同じエラーですか?

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 11:33
by 入門レベル
同じエラーです。

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 11:47
by non
私の環境では動きます。(Borland C++)
Visual C++2008 は使ったことがないのでわかりません。
どなたかVisualC++2008で確認願えますか?

ところで、ファイル(memo.txt)はどんなんですか?

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 11:47
by Mist
入門レベルさんのソースをVC++2008EEで実行してみましたが、正常に動作しますよ。
一度リビルドしてみてはいかがでしょうか。

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 11:53
by 入門レベル
メモ帳でABCDE22HIJK2LKJMJG200みたいな文をコピペで30行ぐらい貼り付けたものです。
少しいじくってみますね

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 11:59
by 入門レベル
すいません。

>>if ((fp = fopen("memo.txt", "r")) == NULL) {



if ((fp = fopen("memo.txt", "r")) = NULL) {

になっていました・・
無事できましたありがとうございました。

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 12:00
by GPGA
一行の文の中にある数字の数が9個を超えると、
バッファオーバーフローが発生しますが、それが原因の可能性はありますか?

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 12:20
by non
コピペだろうになんで?

1行の数字の数ではなく、桁数が9桁を超えた場合はおかしくなります。

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 13:17
by 入門レベル
以前エラー原因しらべてたときにコピペで貼り付けたのをそのままコンパイルするなとかあったのみたので手動で・・

ところですっかり忘れていたのですがこのプログラムだと小数点の数字が表示されないですよね。
%dの所を%fとかにしてみましたが動かず。どうすれば小数点数字も表示されますか?

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 13:45
by non
小数点は数字じゃないですからね。
isdigitとatoiの所も変更が必要ですね。

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 14:05
by たかぎ
> どうすれば小数点数字も表示されますか?

あとから、符号や指数部も表示されないとか言い出しそうですね。

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 14:20
by 入門レベル
数字は整数と小数点数字の両方表示できる気でいたんですがプログラム見る限り無理ということに気づきました。
符号と指数部はまた別物でしょう。大変失礼ですが何のアドバイスもなく嫌味としかとれない書き込みは控えていただきたい。

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 14:36
by たかぎ
> 数字は整数と小数点数字の両方表示できる気でいたんですが

結局、「数字」ではなく「整数」や「浮動小数点数」を扱いたいということでしょうか?
だとすると、ぜんぜん話が違います。

> 符号と指数部はまた別物でしょう。

少なくとも符号が扱えなければ整数も浮動御小数点数も表現できないと思うのですが...

> 何のアドバイスもなく

(スルーされているようですが)何度もアドバイスしていますよ。

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 14:44
by 入門レベル
>>結局、「数字」ではなく「整数」や「浮動小数点数」を扱いたいということでしょうか?
だとすると、ぜんぜん話が違います。

そういうことになります。まだ習いたてなので即思いつきませんでした。


>>少なくとも符号が扱えなければ整数も浮動御小数点数も表現できないと思うのですが...

その辺はまだなんとも・・。

>>(スルーされているようですが)何度もアドバイスしていますよ。

失礼ですがNo:24032 の書き込みに対してのみ言っています。
まだ理解できない単語があって難しいということもあり、知っている単語が書いてあるnonさんの書き込みに目がいきました。たかぎさんのアドバイスは後々参考にさせていただきます。

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 15:06
by non
NCコードのような数値のみ取り出したいと思っていました。
数値としてどこまで必要か、正確にお知らせください。
すべてを満足するようにすると、かなり面倒なことになりますので、必要でない条件は加えないでください。
例えば 数字の間にスペースが入る場合とか、2行に数字が渡っているとか・・・
指数表示とか、まして、式が入るとか。有効数字は何桁かなどなど・・・

なお、小数点が含まれた場合は、先のヒントで解けたでしょうか?

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 15:15
by 入門レベル
まだisdigitやatoiなど本見ながらじゃないとできないレベルですので当分時間がかかると思います。

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 16:13
by たかぎ
>> 結局、「数字」ではなく「整数」や「浮動小数点数」を扱いたいということでしょうか?
>> だとすると、ぜんぜん話が違います。
> そういうことになります。まだ習いたてなので即思いつきませんでした。

No:23978では、規約の「自分が今行いたい事は何か」に関して

> 1:記載済み

とのことでしたので、最初の質問内容のみを条件と考えていましたが、どうやらいったん振り出しに戻ったほうがよさそうです。
結局やりたいことは何なのか、改めて定義してみてください。
仮にC言語のレベルが低くても、必要なことを普通に日本語で説明していただければ、それなりの対応ができるはずです。

>> 少なくとも符号が扱えなければ整数も浮動御小数点数も表現できないと思うのですが...
> その辺はまだなんとも・・。

例えば、- という符号が使えなければ、-123のような負の値を表現できませんよね。
-123ではなく、▲123とか、(123)でマイナス(というか赤字)を表現するにしても、何らかの形で符号が必要なはずです。
負の値を扱う必要がないのないのであれば、それを明確にしてください。扱うのであればどうすればよいのか明確にしてください。3桁ごとの区切りが必要とか、漢数字やローマ数字を使うとか、そういったこともあるなら明確にしてください。

また、「整数」というのは、一般的には(数学的には)絶対値の上限が制約されません。制約があるなら、あるいは制約を課してもよいなら、それを明確にしてください。
浮動小数点数の精度についても同様です。C言語では、浮動小数点数というのは複素数も含みますが、複素数を扱う必要がないならそのことも明確にしてください。非数や無限大についてもお願いします。

後だし条件を極力排除するように、くどい補足要求になっていますが、ご協力お願いします。

> 失礼ですがNo:24032 の書き込みに対してのみ言っています。

その一点だけをとらえて、アドバイスがないことを非難されても...

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 17:16
by 入門レベル
完全に私のミスで申し訳ないです。これ以上追加はありません。ですので1つにまとめます。



>>とのことでしたので、最初の質問内容のみを条件と考えていましたが、どうやらいったん振り出しに戻ったほうがよさそうです。
結局やりたいことは何なのか、改めて定義してみてください。
仮にC言語のレベルが低くても、必要なことを普通に日本語で説明していただければ、それなりの対応ができるはずです。


※整数に絶対値の上限の制約はつけても大丈夫です浮動少数もファイルを見た所小数点以下5桁が最高のようです。
無限大、複素数なし。

私の作ったファイル(memo.txt)では符号(-)はないですが今後のことも考え符号付の整数も入れれるようにしたいと思います。

ですのでX86.191Y-0.022など書かれた文字列から符号付の数字を取り出す

ex)X84.534Y0.351
X101.25Y-0.934


結果
84.534
0.351
101.25
-0.222

となればokです


>>その一点だけをとらえて、アドバイスがないことを非難されても

もうこの話題はよしましょう。ただ文章には書き手と読み手が存在します。書き手が書いたことを読み手がどう思うか
は人それぞれです。貴方の私に対する回答に私が不満を覚えた。それだけです。世間的にどちらが悪いとかいうのは
ありません。それさえ肝に銘じておいていただければいいです。もちろん私の反論で貴方が気分を害してるのも承知しています。読み手がどう思うかはある程度予測がつくと思うので私も貴方も今後気をつければいいでしょう。


度重なる追加真に申し訳ありません。今後このようなことはないように心がけます。

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 17:33
by non
前回の小数点にチャレンジしてもらえれば、その後は-符号だけですから、そんなに難しくないでしょう。
小数点以下6桁ですから、atofでいいと思います。

変更するのは下の3行だけです。

if(isdigit(*str)){

while(*str!='\0' && isdigit(*str))

printf("%d\n",atoi(s));

符号に-をつかえるようにするのは、上の2行を工夫してください。
桁数のための配列は安全のため、もうすこし大きくした方がいいかもしれません。小数点より上の桁数がわかりませんので。

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 17:51
by 通りすがり
教えてくれしか言ってないくせに何この態度。
たかぎさんの指摘は正しかったのにもうその話題はよしましょう?
偉そうにしても答えてくれる人がいるからっていい気になってるとしか思えませんね。
もう少し態度改めたらどうです?

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 18:05
by たかぎ
こんな感じでどうでしょうか?
void func(FILE *stream)
{
  while (fscanf(stream, "%*[^0-9.+-]") != EOF)
  {
    int c = getc(stream);
    int minus = 0;
    double x = 0, f = 1;

    switch (c)
    {
    case '+':
      break;
    case '-':
      minus = 1;
      c = getc(stream);
      break;
    }

    while (isdigit(c))
    {
      x = x * 10 + c - '0';
      c = getc(stream);
    }

    if (c == '.')
    {
      c = getc(stream);

      while (isdigit(c))
      {
        f /= 10;
        x = x + f * (c - '0');
        c = getc(stream);
      }
    }
    if (minus)
    {
      x = -x;
    }
    printf("%#g\n", x);
  }
}
元の桁数を維持したいのであれば、いったんxに格納するのではなく、文字列として管理する必要があるでしょう。

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 18:31
by non
たかぎさん
printf("%#g\n", x);
この#フォーマット指定子は初めて知りました。入門レベルさんの小数点以下表示をどうしようかと
思ってました。たぶんどうでもいいとは思いましたが。
fscanf(stream, "%*[^0-9.+-]") != EOF といい、こういうの得意ですね。
私は、相手がマイコンなので、ほとんど使ったことがありません。

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 18:39
by non
あれ、勘違いか。
小数点以下の不要な0の非表示じゃ、ないんですね。
整数値の0表示みたいですね。
実行せずに、申し訳ありません。

小数点以下の0の非表示をするフォーマット指定子ってあるんですか?
(自分で調べろっていわれそう)m(_ _)m

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 18:47
by バグ
何日か前に非常によく似た質問に回答したような気がするのは私だけでしょうか…
あの時はMFCを使いましたが、考え方自体は同じなんで、過去スレを検索するのも良いかもしれませんよ(・ω・)ノ

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 18:52
by Mist
あれは見たけど質問主さんのやりたいこととはなんか違うっていうのが話の始まりだったかと。

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 19:07
by バグ
そうでしたか(^_^;)

現状を見ると、そっくりに見えたもので、つい口をはさんでしまいました。失礼しました…m(_ _)m

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 19:18
by たかぎ
> printf("%#g\n", x);

これは、最初 "%#.*g\n" にしようと思って付けていたもので、単なる消し忘れです。

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 20:17
by non
あっちこっち調べてみましたけど、小数点以下の不要な0を表示しない指定子は見つかりませんでした。
なさそうですね。作った方がはやそう。

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 20:50
by たかぎ
> あっちこっち調べてみましたけど、小数点以下の不要な0を表示しない指定子は見つかりませんでした。

小数点以下の桁数は分かっているわけですから、指数部が不要なのであれば、
fprintf(stream, "%.*f\n", 小数点以下の桁数, x);
とすれば実現できます。
この場合、小数点以下の桁数が0であれば、小数点以下の0や小数点は出力されません。

Re:C言語 文字列判別

Posted: 2008年11月14日(金) 21:30
by non
小数点以下の桁数は分かっていないと思いますが、
>結果
>84.534
>0.351
>101.25
>-0.222

このように、2桁の場合と3桁の場合があります。
でも、これも始めて知りました。*がミソですか。ワイルドカードですね。
fprintf(stream, "%.*f\n", 小数点以下の桁数, x);

Re:C言語 文字列判別

Posted: 2008年11月15日(土) 07:45
by 組木紙織
今までの流れを全否定するようなことかもしれませんが、
ひとつ気になっていることがあるので書き込みをします。

次の図形描写に使いたいという意図が入門レベルにあるようなので、
任意の文字列から数値列を取り出すのではなくて、
入力するファイルのフォーマットは決まっているんじゃないでしょうか。

Re:C言語 文字列判別

Posted: 2008年11月15日(土) 08:01
by たかぎ
> 次の図形描写に使いたいという意図が入門レベルにあるようなので、
> 任意の文字列から数値列を取り出すのではなくて、
> 入力するファイルのフォーマットは決まっているんじゃないでしょうか。

多分そうだと思いますが、そのような質問の仕方ではないですよね。
図形描写といっても、具体的には何のことかさっぱりわかりませんし。

Re:C言語 文字列判別

Posted: 2008年11月15日(土) 17:38
by non
たぶん、こんなんでしょうね。
>X84.534Y0.351
>X101.25Y-0.934

昔、デジタイザでクリックした座標を上のように取り込んで、XYプロッタで書かせるプログラムを作ったことがあります。25年ぐらい前でしたか・・・。年がばれますね。

Re:C言語 文字列判別

Posted: 2008年11月17日(月) 16:33
by 入門レベル
>>教えてくれしか言ってないくせに何この態度。
たかぎさんの指摘は正しかったのにもうその話題はよしましょう?
偉そうにしても答えてくれる人がいるからっていい気になってるとしか思えませんね。
もう少し態度改めたらどうです?


教えてもらう側が教える側に敬意を評するのは当然ですが、貴方のように教えてもらう人を見下す人がいるのもまた事実。さらに言うならばたかぎさんにはアドバイスをいただき感謝をいているからこそ不毛な論争を避けるべく、発言しましたが本来はあなたのような人に言うべきでしょうね。アドバイスも出さないで煽ることしかしない人は黙っててもらえませんか?たかぎさんに文句をいわれるならともかくね・・。
以前も書きましたがどちらが悪いとも言っていません。ただ私が若干気分を害しただけのこと。
態度を改めろと言われると少し納得しますがそれ以上にそっくりそのまま貴方にお返ししますよ。

Re:C言語 文字列判別

Posted: 2008年11月17日(月) 16:36
by 入門レベル
類似スレは見ましたが区別と取り出しはまた違うプログラムかなと思いましたので質問させていただきました

Re:C言語 文字列判別

Posted: 2008年11月17日(月) 16:37
by 入門レベル
最後に貴重な意見ありがとうございました。

Re:C言語 文字列判別

Posted: 2008年11月17日(月) 16:58
by non
参考までに解答例
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
	FILE *fp; 
	char *str,str1[100];
	char s[10],*s1;

	if ((fp = fopen("memo.txt", "r")) == NULL) {
		printf("file open error!!\n");
		return EXIT_SUCCESS;
	}

	while (fgets(str1, 100, fp) != NULL) {
		str=str1;
		while(*str!='\0'){
			if(isdigit(*str) || *str=='-' || *str=='.'){
				s1=s;
				while(*str!='\0' && (isdigit(*str) || *str=='-' || *str=='.'))
					*s1++=*str++;
				*s1='\0';
				printf("%f\n",atof(s));
			}
			else
				str++;
		}
	}
	fclose(fp);
	return 0;
}

Re:C言語 文字列判別

Posted: 2008年11月17日(月) 17:00
by 入門レベル
親切にどうもありがとうございました。