- ベストアンサー
文字列の比較について
terra5の回答
- terra5
- ベストアンサー率34% (574/1662)
きちんとやる場合でなく、簡単に書く場合を・・・。 while(gets(line)) { n = sscanf(line," %[a-z] = %d ; %s", name,&num,comment); if ( n >= 2 && !strcmp(name,"data") { } } まあ、gets()なんて使うとバッファオーバーフロー攻撃を受けるとか, エラーチェックが手抜きとか、そういう問題はありますし、 その上、思いついたのを書き下ろしただけで、 コンパイルはおろか、ちゃんと動くかもわかりません(^^;;;; でも、私が使い捨てレベルのプログラムを書くときにはよく使ってます。
関連するQ&A
- 文字列の比較
現在Cでプログラムをつくっているのですが いきずまってしまいました。 1.テキストファイルを読み込む 2.書き込みファイルを開く 3.読み込んだデータを一行読み込んで その行の特定の文字列があれば、 特定の文字列のみ取り出し、 書き込みファイルに書く。 4.次以降の行も同じ処理をする。 5.読み込み、書き込みファイルを閉じる。 と、こんな感じのプログラムなのですが、 3の特定の文字列をどのように取り出せばいいのかわかりません。 取り出したいのが数字ならば、if文でできるのですが 文字列の場合は、どうなんでしょうか。 例えば、「MOJIRETU11」という取り出したいとき 数字と同じようにIF文を使用することは、できるのでしょうか。
- ベストアンサー
- C・C++・C#
- エクセルでダブっている文字列を見つける
いつもお世話になっています。 早速ですが、エクセルで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文字)だけ取り出せません。 関数か何かの方法で文字数を分ける方法を教えてください。
- ベストアンサー
- Excel(エクセル)
- 文字列を比較
文字列を比較して 一つでも一致したらファイルに書き込まず抜ける 一つも一致しなかった場合一度書き込んで抜けるという操作を 下記のコードで実現したいんですけど、 "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; }
- 締切済み
- C・C++・C#
- 【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行くらいで済みそうな気がするんですが、あまりプログラミングをやったことありません。なので、すみませんがご教授お願いいたします。
- ベストアンサー
- Visual Basic
- 文字列抽出についてご質問です。
文字列抽出についてご質問です。 csvファイルの中に、http://hoge.com/◎◎/goods_parts/◎◎/数字1~5桁/◎◎・・・ のようなデータがずらっと1000行くらいあって、 このURLの中にある数字1~5桁が、別ファイルの1~5桁の数字だけがあるファイルと合致したら、 出力のようにしたいです。 そこで、phpかexcelvbの正規表現で、 ・数字のみを抽出するサンプルコードをおしえていただけないでしょうか。 なにとぞよろしくお願いいたします。
- ベストアンサー
- PHP
お礼
ありがとうございました。 結局、自分でポインタごとに比較してやりました。 自分で作るのは難しいですね。