No.16012![]() |
特定文字列の前後の文字列の確保 投稿者---すぬ(2004/07/30 22:17:40) |
||
こんばんは。すぬともうします。 ご教授お願いいたします。 以下のようなデータがあります。 この中から"321"という文字列の前後10文字ずつ(計20文字)を確保したいのですが 出来ません。ここまでやってみたのですがアドバイスをお願いします。 例 6*2614505049#3213*814*342128112 ↓ 614505049#3*814*3421 データ(1行1データです。1行毎に前後10文字ずつ確保したいです。) 546**05902*2012314*2*3216*1122204*6*9814111128141160 6*2614505049#3213*814*342128112 15303*9#1783214*2482394813030382* 2*3*9032*4#6*2302*53213004421815 3*6*02*4*226*4321519815203* 5905321914*913303820 66*24293215 10文字に満たないものはある分だけ確保したいです。 66*24293215 ↓ 66*24295 ソースです。 #include<stdio.h> #include<stdlib.h> #include<stddef.h> #include<string.h> #define MAXLEN 256 #define N 10 char cnt_str[MAXLEN]; void shokika(char a[MAXLEN]){ int i=0; for(i=0;i<MAXLEN;i++) a[i] = '\n'; } int main(int argc,char *argv[]){ char num_str[MAXLEN],CSC[MAXLEN]; int i=0,ii=0,iiii=0,CSC_n=0,flag=0; FILE *fp_in,*fp_out; fp_in = fopen(argv[1], "rb"); if (fp_in == NULL){ printf("Cannot open file.\n"); return -1; } fp_out = fopen(argv[2], "w"); printf("対象文字列:"); scanf("%s",CSC); for(i=0;;i++){ if( CSC[i]=='0' || CSC[i]=='1' || CSC[i]=='2' || CSC[i]=='3' || CSC[i]=='4' || CSC[i]=='5' || CSC[i]=='6' || CSC[i]=='7' || CSC[i]=='8' || CSC[i]=='9' || CSC[i]=='*' || CSC[i]=='#'){ CSC_n++; } else break; } while(fgets(num_str,MAXLEN,fp_in) != NULL){ shokika(cnt_str); flag=0; for(i=0;num_str[i]!='\n';i++){ if(num_str[i] == CSC[0]){ for(ii=1;ii<CSC_n;ii++){ if(num_str[i+ii] != CSC[ii]) break; if(CSC_n == ii+1){ flag = 1; iiii = i; } } } } if(flag != 0){ if(iiii < N){ for(i=0;i<iiii+CSC_n+N || num_str[i] != '\n';i++){ if(i<iiii) cnt_str[i] = num_str[i]; if(i >= iiii) cnt_str[i] = num_str[i+CSC_n]; } } else if(iiii >= N){ for(i=0;i < iiii+CSC_n+N || num_str[i]!='\n';i++){ if(i<N) cnt_str[i] = num_str[iiii-N+i]; else if(i >= N) cnt_str[i] = num_str[iiii-N+i+CSC_n]; } } printf("%s",cnt_str); } } return 0; } |
No.16013![]() |
環境です 投稿者---すぬ(2004/07/30 22:19:18) |
||
環境はUNIXでコンパイラはgccです。 お願いいたします。 |
No.16017![]() |
Re:特定文字列の前後の文字列の確保 投稿者---あかま(2004/07/30 23:19:58) |
||
どぞ。入力はリダイレクトで。 #include <stdio.h> #include <string.h> int main(){ char str[256]; char *a,*b; while(fgets(str,256,stdin)!=NULL){ a = strstr(str,"321"); if(a == NULL){ printf("not found\n\n"); continue; } b = a + strlen("321");; *a = '\0'; //"321"の前10文字を出力 if(str+10 <= a) a -= 10; else a = str; printf("a=%s\n",a); //"321"の後10文字を出力 if(strlen(b) > 10) b[10] = '\0'; printf("b=%s\n\n",b); } return 0; } |
No.16024![]() |
Re:特定文字列の前後の文字列の確保 投稿者---すぬ(2004/07/31 15:00:18) |
||
有り難う御座います。 おかげさまで問題解決しました。 strstrをすっかり忘れていたし、違うものをイメージして組んでました。 勉強になりました。 |