您的位置:首页 > 编程语言 > C语言/C++

笔试题:C语言中的字符串问题

2015-09-16 21:10 411 查看
做编程题时,使用字符串一般都是直接用的C++的string类库,比C语言指针型操作字符串要简易方便很多。但是笔试题中,经常考察指针在C语言字符串中的问题。

下面就我遇到的一些题,谈下我的理解,如有偏差请指正。

第一题:

void f(char *p)
{
	p=(char*)malloc(10);
	strcpy(p,"Hi");
}
void main()
{
	char *p=NULL;
	f(p);
	printf("%s",p);
	free(p);
	system("pause");
}


这段代码的打印结果是:null.而不是Hi.

原因在于:f函数对参数p进行值传递,函数内形参的操作并不会影响实参的值,实参p仍然是空。

如果想要成功将”Hi“赋给主函数中的p,有两种方法,一种是地址传参,一种是引用传参。代码分别见下。

地址传参

void f(char **p)
{
	*p=(char*)malloc(10);
	strcpy(*p,"Hi");
}
void main()
{
	char *p=NULL;
	f(&p);
	printf("%s",p);
	free(p);
	system("pause");
}


引用传参

void f(char *&p)
{
	p=(char*)malloc(10);
	strcpy(p,"Hi");
}
void main()
{
	char *p=NULL;
	f(p);
	printf("%s",p);
	free(p);
	system("pause");
}


第二题

void GetMeory(char *p)
{
	p=(char *)malloc(100);
}
void test()
{
	char *str=NULL;
	GetMeory(str);
	strcpy(str,"hello world");
	printf(str);
}

int main()
{
	test();
	system("pause");
	return 0;
}


上述程序运行崩溃。原因与上题相似,GetMeory函数是以值传递方式传参,分配给给形参的空间并没有成功分配给实参str,str仍未空,将一个字符串拷贝给它导致崩溃。

有三种方法可以解决上述问题。一种是引用传值,一种用全局变量记录下GetMeory函数中分配的地址,再在主函数中赋给str,还有一种指针传参。

引用传参

void GetMory(char *&p)
{
	p=(char *)malloc(100);
}
void test()
{
	char *str=NULL;
	GetMory(str);
	strcpy(str,"hello world");
	printf(str);
}

int main()
{
	test();
	system("pause");
	return 0;
}


全局变量

char *a;
void GetMory(char *p)
{
	p=(char *)malloc(100);
	a=p;
}
void test()
{
	char *str=NULL;
	GetMory(str);
	str=a;
	strcpy(str,"hello world");
	printf(str);
}

int main()
{
	test();
	system("pause");
	return 0;
}


指针传参

void GetMory(char **p)
{
	*p=(char *)malloc(100);
}
void test()
{
	char *str=NULL;
	GetMory(&str);
	strcpy(str,"hello world");
	printf(str);
}

int main()
{
	test();
	system("pause");
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: