免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1950 | 回复: 3
打印 上一主题 下一主题

[Linux] 从文件中查找匹配字符串问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-24 20:27 |只看该作者 |倒序浏览
废话不说,要求如标题:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#define MAXLINE 1024;

int linesNum;
static int sunday(const char* src, const char* des)
{
int len_s=strlen(src);
int len_d=strlen(des);
int next[26]={0};
int i,j;
for(i=0;i<26;++i)
next[i]=len_d+1;
for(j=0;j<len_d;++j)
next[des[j]-'a']=len_d-j;
int pos=0;
while(pos<(len_s-len_d+1))
{
int i=pos;
int j;
for(j=0;j<len_d;++j,++i)
{
if(src[i]!=des[j])
{
pos+=next[src[pos+len_d]-'a'];
break;
}
}
if(j==len_d)
return pos;
}
return-1;
}

int main(void)  
{  
FILE * fp;  
char *line = NULL;
//char line[100];  
size_t len = 0;  
ssize_t read;
int end=0;  

     fp = fopen("files", "r");
     while((fgets(line,1024,fp))!=NULL){   
linesNum++;
//end=strlen(line)-1;
//line[end]=0;
printf("%d\n",linesNum);
puts(line);
if(sunday(line,"lianghui")>=0)
printf("find match line at:%d\n",linesNum);
      }   
   fclose(fp);   
}
运行出错:
Segmentation fault,求大神指导我该怎样做,先谢谢了

论坛徽章:
0
2 [报告]
发表于 2013-04-24 23:16 |只看该作者
fopen返回值有检查吗?

论坛徽章:
0
3 [报告]
发表于 2013-04-25 22:55 |只看该作者
本帖最后由 txgc_wm 于 2013-04-25 22:58 编辑

楼主,是否应该把你要实现的功能说的明白些。这么一坨没有排版过的代码,谁有那么好的心情看???
  1. #include<stdlib.h>
  2. #include<unistd.h>
  3. #include<string.h>
  4. #include<stdio.h>



  5. #define LETTER_MAX_LEN 256
  6. #define MAXLINE 1024

  7. static int sunday(const char *src, const char *des)
  8. {
  9.         int i, pos = 0;
  10.         int len_s, len_d;
  11.         int alphabet[LETTER_MAX_LEN] = {0};

  12.         if(src == NULL || des == NULL)
  13.                 return -1;

  14.         len_s = strlen(src);
  15.         len_d = strlen(des);

  16.         for(i = 0; i < LETTER_MAX_LEN; i++)
  17.                 alphabet[i] = len_d;

  18.         for(i = 0; i < len_d; i++)
  19.                 alphabet[des[i]] = len_d - i - 1;

  20.         for(pos = 1; pos <= len_s - len_d; ) {
  21.                 for(i = pos - 1; i - pos + 1 < len_d; i++) {
  22.                         if(src[i] != des[i - pos + 1])
  23.                                 break;
  24.                 }
  25.                
  26.                 if((i - pos + 1) == len_d)
  27.                         return pos;
  28.                 else
  29.                         pos += alphabet[src[pos + len_d - 1]] + 1;
  30.         }

  31.         return -1;
  32. }

  33. int main(int argc, char **argv)
  34. {
  35.         FILE *fp = NULL;
  36.         char line[MAXLINE] = {0};  
  37.         int linesNum;

  38.         fp = fopen(argv[1], "r");
  39.         if(fp == NULL) {
  40.                 printf("can not open file %s\n", argv[1]);
  41.                 return -1;       
  42.         }

  43.         while ((fgets(line, MAXLINE, fp)) != NULL) {
  44.                 linesNum++;
  45.                 printf("%d\n", linesNum);
  46.                 puts(line);
  47.                 if (sunday(line, "lianghui") >= 0)
  48.                         printf("find match line at:%d\n", linesNum);
  49.         }

  50.         fclose(fp);
  51.         fp = NULL;

  52.         return 0;
  53. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2013-04-29 21:53 |只看该作者
问题已经解决,谢谢~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP