
#include"stdlib.h"
#define NMEMB 50
#define SIZE 10
#include <string.h>
int compar (const void *a,const void *b)
{
return (strcmp((char *) a, (char *) b))
}
int main()
{
char data[NMEMB][SIZE]={"Linux","freebsd","solzris","sunos","windows"}
char key[80],*base,*offset
int nmemb= 5,size=SIZE
fgets(key,sizeof(key)/sizeof(key[0]),stdin)
key[strlen(key)-1]='\0'
base = data[0]
offset = (char *)bsearch(key,base,nmemb,size,compar)
if(offset ==NULL)
{
printf("%s not found!\n",key)
}
else
{
printf("found : %s \n",offset)
}
}
在的所在.c文件的目录中在终端里面敲
1. ulimit -c unlimited
2. 在用gcc编译时,在最后加上-g
3. 运行一次错误代码,出现段错误后, 目录中有一个core文件
4. 运行:gdb ./a.out core
会自动帮你找出可能出错的代码,出现段错误一般都是越界了
有几个问题:
文件在读取了你的字符串后,文件指针位置已经到了该字符串后面,如果puts则会在字符串后面输出,比如:文件内容是aaaa\nbbbb\ncccc\n,你读到bbbb行后,文件指针指向cccc\n的首字符,如果puts的话会覆盖cccc\n。按照设计目的,你应当让文件指针返回字符串bbbb\n的首字符再输出。
在输出了覆盖字符串后,还应当将文件后面所有行重新写一遍才行。
比如文件内容是aaaa\nbb1bb\ncccc\n,如果只删除b1则变成aaaa\nbbb\nb\ncccc\n,而实际上应当改成aaaa\nbbb\nccc\n。
用同一个文件实现这个功能时,文件的结束很难截断。
建议如下修改:
FILE *fp,*tp
int l
char *p
char filename[80] = { "a.txt" }
char filename1[80] = { "b.txt" }
char r[] = { "abc123" }
char buff[256]
int success = 0
if (fp = fopen(filename, "r"))
{
if (tp = fopen(filename1, "w+"))
{
l = strlen(r)
while ( !feof(fp) )
{
fgets(buff, 200, fp)
if (p = strstr(buff, r)) strcpy(p, p + l)
fputs(buff, tp)
}
fclose(tp)
success = 1
}
else printf("cann't open target file!\n")
fclose(fp)
} else printf("can't open file!\n")
if (success) { remove(filename)rename(filename1, filename)}
【测试】
原a.txt内容为:
abcdefghijklmn
1234567890
a1a2abc123a4a5a6
b1b2b3b4b
ccccc
运行程序后为:
abcdefghijklmn
1234567890
a1a2a4a5a6
b1b2b3b4b
ccccc
注意:原a.txt文件中最后一行后面不换行结束。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)