• ベストアンサー

文字列を分解したいのですが・・・

VC++初心者です。 ある文字列(数値、数値、数値CRLF数値、数値・・・)のような中からコンマで区切られた数字を取り出したいのですがうまくいきません。 とりあえずはコンマと改行コードの位置だけでも探したいのですがどうやったら良いでしょうか?お知恵を貸してください。 char buffer[64] = 10.52,5.88,4.37(改行コード)6.42,41.91; char* result; int ch1 = "CRLF"; result = strchr(buffer,ch1); int ch2 = "," result = strchr(buffer,ch2); 改行コードは最初の文字列に入ってるはずですが見えないので(改行コード)と入力しました。 よろしくお願いいたします。

  • 110pp
  • お礼率100% (7/7)

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

1. > int ch1 = "CRLF";  この行はどういう意味だい? C言語でCR/LFを表現するには、"\r\n"としなければならない。 2. strchr関数は、文字列中から「文字」を検索する関数だ。"\r\n"のように、2文字からなる「文字列」を検索する場合は、変わりにstrstr関数を使用する。 char *strstr(char *str1, char *str2) ch2の方は「,」1文字なので「","」ではなく「','」としてstrchrでも良いが、どうせなのでstrstrで統一した方がソースの見通しが良いだろう。 具体的にはこんな感じ。 char buffer[64] = "10.52,5.88,4.37\r\n6.42.41.91"; char *ch1 = "\r\n"; result = strstr(buffer, ch1); char *ch2 = ","; result = strstr(buffer, ch2);

110pp
質問者

お礼

めちゃめちゃありがとうございます。 改行を"\r\n"とあらわすことと strstrという関数があること 勉強になります。

その他の回答 (2)

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.3

以下の2行は誤りです。ワーニングかエラーになる筈ですが。 int ch1 = "CRLF"; int ch2 = ","; この2行は「charのポインタをintにキャストして代入」しています(ポインタが指すアドレスをint型とみなして代入している) int ch1 = '\n'; int ch2 = ','; が正しいです(ダブルクォーテーションではなくシングルクォーテーションで括っているのに注意) なお、テキストモードでオープンしたストリームからfread関数等で読み込んでbufferにセットしている場合、改行文字は「\n」1文字になるので注意して下さい。 ファイルの中のCR+LF(\r+\n)は、バッファに読んだ時点でLF(\n)のみの1文字になります。

110pp
質問者

お礼

ん? "\r\n"か'\n'かは両方試してみます。 ありがとうございます。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

文字列じゃなくて、数値として取り出すなら #include <stdio.h> void main(void){ char buffer[64] = "10.52,5.88,4.37\n6.42,41.91"; double num[5]; int i; sscanf(buffer,"%lf,%lf,%lf\n%lf,%lf",&num[0],&num[1],&num[2],&num[3],&num[4]); for(i=0;i<5;i++) printf("%f\n",num[i]); } のようにすればいいです。 まあ、C++的ではないけども。

110pp
質問者

お礼

ぉおお! こんなやり方もあるのですか。 ありがとうございます。

関連するQ&A

  • int型のchar型への代入について

    VC++6.0のfgetcのヘルプに以下のようなコードが有りました。 int型のchをcharのbuffer[i]に代入するということに違和感を感じたのですが、 1.このようにする必要性とは何なのでしょうか? 2.このような代入により具体的には何が行われているのでしょうか? 3.そもそも1文字とりだすfgetcの戻り値がcharでなくintなのはなぜ? 質問が漠然としていて申し訳ありませんが、お願いします。  FILE *stream; char buffer[81]; int ch; 省略   stream = fopen( "fgetc.c", "r" )) 省略 ch = fgetc( stream ); 省略 buffer[i] = ch;

  • 数字を文字列に

    int i = 10; char *ch; とするとiを文字列としてchに代入し結果が ch[0] = 1 ch[1] = 0 となるようにするにはどう組めば良いのでしょうか? よろしくお願いいたします。

  • C言語で整数を文字列へ型変換

    C言語で整数を文字列へ型変換 int result[11]; const char *tmp; resultの中の11個の数字を 1,2,3,4,5,6,7,8,9,10,11 のような文字列にして、tmpへ代入したんですが、やり方が分かりません。 Cの初心者ですので、教えていただきたいです。

  • 文字列

    ・数字文字列を数値化する関数AtoS()を制作する。 書式:short AtoS(char *pStr, int *pRetCode); 引数:char *pStr; 文字列の先頭アドレス    int *pRetCode; 動作の正否を返す 戻り値:pStrを数値化した値 処理: pStrで与えられた文字列をshort型に変換する。 呼び出し側の書式は以下の通りです。 void main(void) {  short val; int code; val = AtoS("1234", & code); printf("%d\n",val); val = AtoS("-789", & code); printf("%d\n", val); } です。 自分自身で、正の整数はできました。見てください。そして、負の整数や、「int *pRetCode」の使い方をおしえてください。 #include <stdio.h> short AtoS(cahr *pStr, int *pRetCode); void main(void) { short val; int code; val = AtoS("1234", & code); printf("%d\n", val); val = AtoS("-789", & code); printf("%d\n", val); } short AtoS("char *pStr, int *pRetCode) { short suu; suu = 0; while("\n" != *pStr) { suu = *pStr - '0' + suu * 10; pStr++;   } return(suu); } までしかできません。どなたか教えてください。  

  • 文字列や文字から整数への変換方法について

    文字列(string型)や文字(char型)から整数(int型など)に変換 する時のルールがよく解りません。 たとえば、キーボードから数字を打って、その入力された数字を 数値として整数型の変数に代入したい場合のやり方です。 ちょっとプログラムを作ってみました。 using System; class clmain { private static void Main() { Console.Write("1桁の整数を入れてね "); char ch = char.Parse(Console.ReadLine()); int by1 = (int)ch; int by2 = (int)char.GetNumericValue(ch); Console.WriteLine("by1 = {0}, by2 = {1}, ch = {1}", by1, by2, ch); Console.Write("整数を入れてね "); string st = Console.ReadLine(); /* by = (int)st; コンパイルエラー */ int by3 = int.Parse(st); Console.WriteLine("by3 = {0}, st = {1}", by3, st); } } まず、char型からint型への変換では、  int型変数=(int)char型変数; はコンパイルは通りますけど、実行すると全く違った値が入って しまいます。たとえば char型変数の値が "1" だと、int型変数には 49 が入ります。 int型変数 = (int)char.GetNumericValue(char型変数); と書いてようやく、思い通りの動きをしてくれます。 また、string型からint型への変換では  int型変数=(int)string型変数; はコンパイルエラーになります。 int型変数 = int.Parse(string型変数); とするとコンパイル出来て正しく動きます。 これで質問ですけど、 (1)なぜstring型とchar型で、int型への変換方法が違うのでしょうか? (2)int型変数=(int)char型変数; とすると、上に書いたように、全く 違った(希望しない)値が代入されてしまいます。これは、どういう 動きをしているのでしょうか? また、これはコンパイルエラーに なりませんけど、どういう時にこの書き方をするのでしょうか? 解る方、お願いします。

  • int型の文字列について

    文字列を扱う場合はchar型をつかいますが、int型がchar型より大きいメモリ領域を確保しているとすると、int型で文字列を扱っても問題はないのではと思いました。 実際にやってみると、処理系によって問題なく作動するものとそうでないものが有りますが、基本的な考え方として文字列をint型で扱うことは問題があるのでしょうか? ご存知の方よろしくお願いいたします。 <補足> 要は、255以下の数字を扱うときに、char型でないといけないという制約はなく当然int型を使えるように、文字列においてint型を使うことは、基本的な考え方として問題なのかをお聞きしたい。 当然、処理系において、ルール的に禁じている場合は使えないということは理解できますが。

  • 文字列→数値変換関数

    ・数字文字列を数値化する関数AtoS()を制作する。 書式:short AtoS(char *pStr, int *pRetCode); 引数:char *pStr; 文字列の先頭アドレス    int *pRetCode; 動作の正否を返す 戻り値:pStrを数値化した値 処理: pStrで与えられた文字列をshort型に変換する。 呼び出し側の書式は以下の通りです。 void main(void) {  short val; int code; val = AtoS("1234", & code); printf("%d\n",val); val = AtoS("-789", & code); printf("%d\n", val); } です。専門学校の明日の朝までの課題なのでどうか、どなたか助けて下さい。 

  • <>で囲まれた文字列を文字列のなかから取り出す方法

    現在、C++を使って、文字列の中から<>で囲まれた部分を抜き出して表示する、というプログラムを書きたいんですが、どうもうまくいきません。例として、 int main(void) { char html[] = "<abdc><kihddds><mokus>"; char *p; int c; c = '<'; p = strchr(html, c); printf("%cは文字列の%d番目にあります。\n", c, p-html+1); } のような感じで最初の<と最初の>の場所を探すのはできるのですが、2個目以降を同じようにさがすことができません・・・。 上記の例でいうと、実行結果として abdc kihddds mokus とでるようなものをつくりたいのです。 良い方法がありましたら、どうぞご教授おねがいしますm(__)m

  • 文字列の分解

    ”abddfr018874”のようにアルファベットと数字が分かれている文字列において、アルファベット部分と数字部分に分けて取り出したいのですが、そういうことが できる関数は有りますか? 多分無いと思うのですが、そうだとすると1文字ずつ数字かどうかを判断して、分解するしかないのでしょうか? <環境> WIN98 VC++6.0 MFC 

  • 文字列中に含まれる文字の個数をカウントするプログラムについて…

    文字列、1文字が与えられたとき、これをポインタで入力し文字列中に含まれる文字の個数を計算するプログラムを作成せよ。 と、いう課題がだされたんですけど、ユーザが任意の文字列と1文字を入力できるようにすることができません…。 多分main関数の部分をちょっといじくればよいと思うのですが…。 どなたかアドバイスをお願いします。 #include <stdio.h> int count(const char *str, const char ch) { int cnt=0; while (*str!='\0') { if (*str==ch) cnt++; str++; } return cnt; } int main() { const char *str="hello,world!"; const ch='o'; int cnt; cnt=count(str, ch); printf("%s中に%cは%d個です\n", str, ch, cnt); return 0; }

専門家に質問してみよう