这段C代码错在哪里?

shifenjiandan 2013-03-30 01:54:48
就是一个简单的程序把La和Lb合并且没有重复元素,不知道问题出在哪,编译通过了,但是运行错误,感觉好像是数组越界了?
求指导...

#include <stdio.h>

void Union(char *La, char *Lb);
int ListLength(char *L);
void GetElem(char *L, int i, char *e);
int LocateElem(char *L, char *e, int (*comp)(char a, char b));
int compare(char a, char b);
void ListInsert(char *, int, char *);

int main(){
char *La;
char *Lb;
int i;
for(i = 0; i <= 10; ++i){
La[i] = i;
Lb[i] = i + 5;
}
La[i] = '\0';
Lb[i] = '\0';
Union(La, Lb);
for(i = 0; La[i] != '\0'; ++i){
printf("%c\n", La[i]);
}
return 0;
}

//unite La and Lb without repeat elements
void Union(char *La, char *Lb){
int La_length = ListLength(La);
int Lb_length = ListLength(Lb);
int i = 0;
char *e;
for(i; i<= Lb_length; ++i){
GetElem(Lb, i, e);
if(!LocateElem(La, e, compare))
ListInsert(La, ++La_length, e);
}
}

//caculate the length of L
int ListLength(char *L){
int i;
for(i = 0; *(L + i) != '\0'; ++i);
return i;
}

void GetElem(char *L, int i, char *e){
*e = *(L + i);
}

//search the element e in L, if exist return the location, else return 0
int LocateElem(char *L, char *e, int (*comp)(char a, char b)){
int i;
for(i = 0; *(L + i) != '\0'; ++i){
if(comp(*(L + i), *e)) return i + 1;
}
return 0;
}

//compare the element a and b
int compare(char a, char b){
if(a == b) return 1;
return 0;
}

//if e doesn't exit in L, insert the e in L
void ListInsert(char *L, int i, char *e){
int j;
for(j = ListLength(L) - 1; j >= i; --j){
*(L + j + 1) = *(L + j);
}
L[ListLength(L)] = '\0';
*(L + i - 2) = *e;
}
...全文
184 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
shifenjiandan 2013-03-30
  • 打赏
  • 举报
回复
引用 1 楼 tonforce 的回复:
哥们,你这有些问题了 你把20-23行注释掉,先看看你在main函数里对那可怜的兄弟俩的赋值情况,你调试调试 进入for循环,第一轮赋值程序就得断气儿了。 // 下面写了个例子,不知道合不合你的意思 C/C++ code?123456789101112#define MAX_NUM 11char arrA[MAX_NUM] = {0};char arrB[……
多谢~我对C的指针和内存还不够了解,现在看这个程序最主要的问题就是每次声明了一个指针却没有给他分配空间,结果自己搞了半天也不知道问题出在哪了... 不过现在问题已经解决了,多谢你啊 另:帖子还发重了,好像你都留言了,分都给你好了~
mass_lynnxy 2013-03-30
  • 打赏
  • 举报
回复
神人,一语中的。
tonforce 2013-03-30
  • 打赏
  • 举报
回复
索性给你来个完整版,其实上面我的代码也有问题,呵呵:

#include<stdio.h> 

#define  MAX_ARR 10+1

void Union(char *La, char *Lb);
int ListLength(char *L);
void GetElem(char *L, int i, char e[]);
int LocateElem(char *L, char *e, int (*comp)(char a, char b));
int compare(char a, char b);
void ListInsert(char *, int, char *);

int main()
{
	char arrLa[MAX_ARR *2] = {0};
	char arrLb[MAX_ARR] = {0};
	int i,iii;
	for(i = 0; i <MAX_ARR; ++i)
	{
		arrLa[i] = 65 + i;
		arrLb[i] = 70 + i;
	}

	Union(arrLa, arrLb);

	for(i = 0; arrLa[i] != '\0'; ++i)
	{
		printf("Result:%c ", arrLa[i]);
	}
	printf("\n\n");

	system("pause");
	return 0;
}

//unite La and Lb without repeat elements
void Union(char La[], char Lb[])
{
	int La_length = ListLength(La);
	int Lb_length = ListLength(Lb);

	int i = 0;
	char e[2];

	for(i; i<= Lb_length; ++i)
	{
		memset(e, 0, 2) ;
		GetElem(Lb, i, e);

		if( !LocateElem(La, e, compare) )
		{
			//ListInsert(La, ++La_length, e);
		}
			
	}
}

//caculate the length of L
int ListLength(char *L)
{
	int i;

	for(i = 0; *(L + i) != '\0'; ++i);
		return i;
}

void GetElem(char *L, int i,char e[])
{
	e[0] = *(L + i);
}

//search the element e in L, if exist return the location, else return 0
int LocateElem(char *L, char *e, int (*comp)(char a, char b))
{
	int i;
	for(i = 0; *(L + i) != '\0'; ++i)
	{
		if(comp(*(L + i), *e)) return i + 1;
	}
	return 0;
}

//compare the element a and b
int compare(char a, char b)
{
	if(a == b) 
		return 1;

	return 0;
}

//if e doesn't exit in L, insert the e in L
void ListInsert(char *L, int i, char *e)
{
	int j;

	for(j = ListLength(L) - 1; j >= i; --j)
	{
		*(L + j + 1) = *(L + j);
	}

	L[ListLength(L)] = '\0';

	*(L + i - 2) = *e;
}
tonforce 2013-03-30
  • 打赏
  • 举报
回复
哥们,你这有些问题了 你把20-23行注释掉,先看看你在main函数里对那可怜的兄弟俩的赋值情况,你调试调试 进入for循环,第一轮赋值程序就得断气儿了。 // 下面写了个例子,不知道合不合你的意思

#define MAX_NUM 11
char  arrA[MAX_NUM] = {0};
char  arrB[MAX_NUM] = {0};

int i = 0;
for( ; i<MAX_NUM; i++)
{
    arrA[i] = 65 + i;
    arrB[i] = 70 + i;
}
arrA[i] = '\0';
arrB[i] = '\0';

后面的大概看了看,感觉有些乱,慢慢调试吧,把这程序调通了,你可以给自己C语言成绩加20分了。 祝你好运!

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧