从文件中匹配字符串并输出匹配行号

独孤行 发布于 2013/04/24 20:32
阅读 874
收藏 1
废话不说,要求如标题:
#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
txgcwm
txgcwm
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<stdio.h>



#define LETTER_MAX_LEN 256
#define MAXLINE 1024

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

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

	len_s = strlen(src);
	len_d = strlen(des);

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

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

	for(pos = 1; pos <= len_s - len_d; ) {
		for(i = pos - 1; i - pos + 1 < len_d; i++) {
			if(src[i] != des[i - pos + 1]) 
				break;
		}
		
		if((i - pos + 1) == len_d)
			return pos;
		else
			pos += alphabet[src[pos + len_d - 1]] + 1;
	}

	return -1;
}

int main(int argc, char **argv)
{
	FILE *fp = NULL;
	char line[MAXLINE] = {0};  
	int linesNum;

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

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

	fclose(fp);
	fp = NULL;

	return 0;
}
0
lwdxinghuo
lwdxinghuo
应该是那个line没有申请空间吧……
0
独孤行

嗯,是的,谢谢~

大哥还可以可以帮看看为什么我找不到匹配字符串啊,明明是有的

0
txgcwm
txgcwm
你这样贴代码太难看了,把你的代码整理一下。另外你测试的文件里的内容,是什么样的格式?
0
独孤行

引用来自“txgcwm”的答案

你这样贴代码太难看了,把你的代码整理一下。另外你测试的文件里的内容,是什么样的格式?
没什么格式,总之我就是新建一个空文件,然后将内容写进去,仅此而已
0
txgcwm
txgcwm

static int sunday(const char* src, const char* des)

=>楼主,你这个函数想实现什么功能? 看不懂你想实现什么。

0
独孤行

引用来自“txgcwm”的答案

static int sunday(const char* src, const char* des)

=>楼主,你这个函数想实现什么功能? 看不懂你想实现什么。

sunday算法啊,就是从src串中查找des匹配串,找到的话返回匹配串在src中的第一个下标
0
kiwivip
kiwivip
perl版本:
while(<>){say $. if /$str/}
0
独孤行

引用来自“kiwivip”的答案

perl版本:
while(<>){say $. if /$str/}

.......

c可是很底层的

kiwivip
kiwivip
学习一下~
0
独孤行

引用来自“txgcwm”的答案

#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<stdio.h>



#define LETTER_MAX_LEN 256
#define MAXLINE 1024

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

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

	len_s = strlen(src);
	len_d = strlen(des);

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

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

	for(pos = 1; pos <= len_s - len_d; ) {
		for(i = pos - 1; i - pos + 1 < len_d; i++) {
			if(src[i] != des[i - pos + 1]) 
				break;
		}
		
		if((i - pos + 1) == len_d)
			return pos;
		else
			pos += alphabet[src[pos + len_d - 1]] + 1;
	}

	return -1;
}

int main(int argc, char **argv)
{
	FILE *fp = NULL;
	char line[MAXLINE] = {0};  
	int linesNum;

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

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

	fclose(fp);
	fp = NULL;

	return 0;
}
thank you very much!
返回顶部
顶部