• ベストアンサー

文字列の比較について

naitieの回答

  • ベストアンサー
  • naitie
  • ベストアンサー率30% (18/60)
回答No.1

Cの標準ライブラリ関数だけで書きたいのですか? こういう処理は、誰でもすること&低レベルな(細かい)処理なので、ホントなら「自作」してはいけません。 記憶があまり定かでないのですが、 Windowsの環境でしたら GetProfileString、GetProfileStringIng, etc... が使えますし、C++のクラスライブラリにも適当なものが見つかるはずです。 (Javaなんかだと、言語標準でクラスが用意されてます。Properties) もしC標準ライブラリだけで自作するのであれば、下のヒントに書いた文字列操作関数を使うと便利だと思います(コンパイラがないので、ちゃんと動くコードをかけなくて残念ですが・・)。    char* strtok(const char*, const char*);    文字列をトークン(特定の文字により区切られる最小の要素)に分割する。    int strncmp(const char*, const char*, int); 文字列同士を先頭からNバイト比較する こういう関数を作成するなら「部品」として再利用したいですよね。 ガリガリと書いた挙句に、汎用性を欠く仕様(左辺がかならず行の最初から始まっていないと×、左辺と=、=と右辺の間にスペースが1つでないと×など・・)にならないよう気をつけてください。たとえば行の先頭が「;] (line[0] == ';') なら、注釈行として読み飛ばすなどの考慮があったほうがベターです。 標準ライブラリ関数も使わない・・なんてのは論外ですよ(笑)。。

tb4104
質問者

補足

すみません。情報が少なかったかも知れません。 とりあえず、DOS上でつかうもので、 また、相手のファイル(質問で出しましたデータSample)が どういう状況ではき出されているのか仕様が全く見えないもので、 分割していく方法しかないのですか。 わたしが考えていたのは、ラインを読み込み スペースを削除し、そして「;」以上は掃き捨てにし、 (ここまではできておるのですが)その後、 検索文字と比較しようとしていたのです。 これよりもいい操作があればと思っていたのですが・・・・ strtokを使うということには思いつきませんでした。 ありがとうございます。参考にさせていただきます。

関連するQ&A

  • 文字列の比較

    現在Cでプログラムをつくっているのですが いきずまってしまいました。 1.テキストファイルを読み込む 2.書き込みファイルを開く 3.読み込んだデータを一行読み込んで   その行の特定の文字列があれば、   特定の文字列のみ取り出し、   書き込みファイルに書く。    4.次以降の行も同じ処理をする。    5.読み込み、書き込みファイルを閉じる。 と、こんな感じのプログラムなのですが、 3の特定の文字列をどのように取り出せばいいのかわかりません。 取り出したいのが数字ならば、if文でできるのですが 文字列の場合は、どうなんでしょうか。 例えば、「MOJIRETU11」という取り出したいとき 数字と同じようにIF文を使用することは、できるのでしょうか。

  • エクセルでダブっている文字列を見つける

    いつもお世話になっています。 早速ですが、エクセルでaというファイルとbというファイル2つのデータがありその中にはそれぞれ13字の文字列(数字)が100以上あるのですが、ダブっているものを見つけるにはどうすれば簡単にできるでしょうか? よろしくお願いします

  • 文字列操作について・・(初心者です)

    いつもお世話になっています。 ファイルの中の文字データを検索して、それを差し替えたり、ある文字を挿入したりする事がしたいのですが、上手くいきません。 今とても困っています↓力を貸して頂くとありがたいです。 <質問> ファイルは2つでAとBと言うテキストファイルがあります。 ●1●で1つのグループ名(数字は昇順で複数あり) ☆1☆で1つのグループ名(数字はランダムで複数あり)  *●~●と☆~☆は同じ数存在します。 A⇒●~●が順に複数入っています B⇒文章が入っている途中に☆~☆が混ざって、入っています。 例)Aの中から●1●を検索する。その文字列をコピーする。Bの中からAで検索した同じ数字の☆1☆を検索する。見つかったら、そこに、貼りつける。 このような、作業は可能ですか?もし可能であれば、どうプログラムを書けばいいですか?ポイントでもいいので教えてください。   

    • ベストアンサー
    • Perl
  • エクセル 関数 文字列を分ける

    23Ar23 28Ar05 3Ta16 8Ta07 11Ta53 14Ta21 …以下多数 のように文字列があって、アルファベット前の数字(1文字か2文字)、アルファベット(2文字)、アルファベット後の数字(2文字)の3つに分割したいのです。データ区切り位置の機能を使えれば簡単ですが、アルファベットの前の文字数が1字と2字のものがあるのでできません。RIGHT、LEFTの関数を使用すれば、アルファベット2文字とアルファベット後の数字2文字は抽出できますが、アルファベット前の数字(1文字か2文字)だけ取り出せません。 関数か何かの方法で文字数を分ける方法を教えてください。

  • 文字列をポインタに

    文字列型のデータをポインタ型のエリアに代入したいのですがどうしたらよいでしょうか? char path[256]; char *INPUTFILE; 「char path」に"c:\windows\temp\inputfile.txt"という、入力ファイルへのパスが格納されているとします。 このデータを「char *INPUTFILE」に入れたいのです。 もしくは「char path」のデータを使って、ファイルをOPENさせる方法を教えてください。(この訊き方のほうがよかったかな?)

  • 文字列を比較

    文字列を比較して 一つでも一致したらファイルに書き込まず抜ける 一つも一致しなかった場合一度書き込んで抜けるという操作を 下記のコードで実現したいんですけど、 "cPid[n] = cStoRegiAdd; for(j = 0;j < MAX;j++){ if(cPid[n] != cRegiTab[j]){ iflag = 1; } } if(iflag == 1){ fprintf(fh,"#define %s 0\n",cStoRegiAdd); }" の部分で何かおかしいとこはありますか?? もしあれば教えていただきたいんですけど?? #include<stdio.h> #include<string.h> #include<stdlib.h> #define MAX 1024 char *cRegiTab[MAX]; // 文字列登録表 int n = 0; int main() { rightsidehfunction(); leftsidehfunction(); } /* 左辺の値をとって.hファイルに書き込む関数 */ int leftsidehfunction() { FILE *ft; FILE *fh; char buf[MAX]; char buf1[MAX]; char *cPid[MAX]; char *cWorkRegiAdd; char *cStoRegiAdd; int istr = 0; int k; char *p; char *q; int s; int i; int j; int iflag = 0; ft = fopen("test.txt","r"); fh = fopen("test.h","a+"); if (fh == NULL || ft == NULL) { printf("ファイルを開けません。\n"); return 1; } /* ファイルを1行ずつ読み込む処理 */ while (fgets(buf, sizeof buf, ft) != NULL){ cWorkRegiAdd = strtok(buf, "="); for(k = 0;k < n;k++){ if(*cPid[k] != *cWorkRegiAdd)continue; if(strcmp(cPid[k],cWorkRegiAdd) == 0)break; } if(k < n) continue; cStoRegiAdd = malloc(strlen(cWorkRegiAdd) + 1); strcpy(cStoRegiAdd,cWorkRegiAdd); cPid[n] = cStoRegiAdd; for(j = 0;j < MAX;j++){ if(cPid[n] != cRegiTab[j]){ iflag = 1; } } if(iflag == 1){ fprintf(fh,"#define %s 0\n",cStoRegiAdd); } n++; } fclose(fh); fclose(ft); return 0; } /* 右辺の値をとって.hファイルに書き込む関数 */ int rightsidehfunction() { FILE *ft; // 入力ファイルポインタ FILE *fh; // 出力ファイルポインタ int c; //読み込み文字 char buf[MAX]; //バッファ領域 char buf1[MAX]; char cPid[MAX]; // 採取したPID char *cWorkRegiAdd; // 採取文字列作業域アドレス char *cStoRegiAdd; // 文字列格納域アドレス int iflag = 0; // 0/1; 右/左のクオート int ichs = 0; // chrの文字数 int istr = 0; // strの文字数 int k; // ntrの探索index int iOid; //OID char *p; ft = fopen("test.txt", "r"); fh = fopen("test.h", "w"); if (fh == NULL || ft == NULL) { printf("ファイルを開けません。\n"); return 1; } //ファイルを1文字ずつ読み込む while ((c = fgetc(ft)) != EOF) { switch (c) { case '"': iflag = 1 - iflag; /*右のクオート*/ if (iflag == 0) { cPid[ichs] = '\0'; cWorkRegiAdd = cPid; for(k = 0;k < istr;k++){ if(*cRegiTab[k] != *cWorkRegiAdd) continue; if(strcmp(cRegiTab[k],cWorkRegiAdd) == 0) break; } if(k == istr){ cStoRegiAdd = malloc(strlen(cWorkRegiAdd) + 1); strcpy(cStoRegiAdd,cWorkRegiAdd); cRegiTab[istr] = cStoRegiAdd; istr++; fprintf(fh, "#define %s 0\n", cStoRegiAdd); } ichs = 0; } break; case '\n': if (iflag == 1) { cPid[ichs] = '\0'; iflag = 0; } ichs = 0; break; default: if (iflag == 1) { cPid[ichs] = c; if (ichs < MAX - 1){ ichs++; } } break; } } /* ファイルの最後が改行じゃなかった場合 */ if (ichs>0) { cPid[ichs]='\0'; } fclose(ft); fclose(fh); return 0; }

  • 文字列変換

    他人が作ったExcelデータを修正しなければいけなくなったのですが時間がかかって手間取っています。 する作業は、選択した文字列を ・カタカナは全角 ・ローマ字は半角 ・数字は半角 とすることです。 手作業ですると時間がかかるので、 マクロとかVBAで作業に無駄をなくせればと思いました。 それで調べてみたのですがStrConv関数というのが出てきましたが、 文字種ではしてくれなさそうなのです。 参考になりそうなものはないでしょうか?

  • 【ACCESS】文字列を抜き出したい

    初心者ですが。分かる方お願いいたします(__)(至急ですみません) 会社の専用システムからCSVデータをダウンロードしました。 その時点で、「商品コード」のフィールドが「"=0123456"」 のようなってしまっています。(「0123456」のように数字だけになっていてほしい) CSVの段階で、文字列関数を使用して数字だけにしてしまえばいいのですが、何万件とデータが重く、ファイルも複数あることから時間がかかってしまいます。 そこで、ACCESSにデータをインポートして加工しようとしましたが、どのようにすれば数字だけ抜き取ることができるでしょうか。 Right関数、left関数も考えましたが、商品コードの文字数が一定していないためできません。 インポートした時点で商品コードのフィールドがテキスト型にされていたので、数値型にすれば数字だけになるかな?と思ってやってみましたがデータがすべて失われてしまいました・・。 良い知恵をお貸しください。 どうぞよろしくお願いいたします。 それをACCESSにインポートしてテーブルを作成致しました。

  • VBA バイナリ―から文字列にする方法

    この度はお世話になります。 現在、バイナリ―ファイル(xxxx.bin)をVBAで読み込み、バイナリ―データを文字列化して、エクセルで解析できるようなシートを作っています。 バイナリ―ファイルの中身が31 39 32 31 ・・・・・となっていたら、31393231・・・と文字列化にしたいです。 そこで、自分でプログラムを考えてみたのですが、バイナリ―が 01 などの場合、など“1”として読み込まれて、“0”が入らず、ずれてしまいます。 Sub 電文解析プログラム() Dim Deciphering_file As Variant '読み込みファイル Dim buf As Byte '1バイト格納 Dim fLen As Long 'ファイルサイズ Dim TEMP(1) As String ' Dim S_JIS As String '文字コード(2バイト) Dim str As String '文字列データ Dim i As Long Deciphering_file = Application.GetOpenFilename("BINファイル(*.bin),*.bin") fLen = FileLen(Deciphering_file) Open Deciphering_file For Binary As #1 For i = 1 To fLen Get #1, i, buf S_JIS = Hex(buf) If buf = 0 Then S_JIS = "00" End If TEMP(0) = Mid(S_JIS, 1, 1) TEMP(1) = Mid(S_JIS, 2, 1) str = myChr & TEMP(0) & TEMP(1) Next i End Sub ホントは3行くらいで済みそうな気がするんですが、あまりプログラミングをやったことありません。なので、すみませんがご教授お願いいたします。

  • 文字列抽出についてご質問です。

    文字列抽出についてご質問です。 csvファイルの中に、http://hoge.com/◎◎/goods_parts/◎◎/数字1~5桁/◎◎・・・ のようなデータがずらっと1000行くらいあって、 このURLの中にある数字1~5桁が、別ファイルの1~5桁の数字だけがあるファイルと合致したら、 出力のようにしたいです。 そこで、phpかexcelvbの正規表現で、 ・数字のみを抽出するサンプルコードをおしえていただけないでしょうか。 なにとぞよろしくお願いいたします。

    • ベストアンサー
    • PHP