C言語関係掲示板

過去ログ

No.1214 特定文字列の前後の文字列の確保

[戻る] [ホームページ]
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をすっかり忘れていたし、違うものをイメージして組んでました。
勉強になりました。