笔试题:C语言中的字符串问题
2015-09-16 21:10
411 查看
做编程题时,使用字符串一般都是直接用的C++的string类库,比C语言指针型操作字符串要简易方便很多。但是笔试题中,经常考察指针在C语言字符串中的问题。
下面就我遇到的一些题,谈下我的理解,如有偏差请指正。
第一题:
这段代码的打印结果是:null.而不是Hi.
原因在于:f函数对参数p进行值传递,函数内形参的操作并不会影响实参的值,实参p仍然是空。
如果想要成功将”Hi“赋给主函数中的p,有两种方法,一种是地址传参,一种是引用传参。代码分别见下。
地址传参
引用传参
第二题
上述程序运行崩溃。原因与上题相似,GetMeory函数是以值传递方式传参,分配给给形参的空间并没有成功分配给实参str,str仍未空,将一个字符串拷贝给它导致崩溃。
有三种方法可以解决上述问题。一种是引用传值,一种用全局变量记录下GetMeory函数中分配的地址,再在主函数中赋给str,还有一种指针传参。
引用传参
全局变量
指针传参
下面就我遇到的一些题,谈下我的理解,如有偏差请指正。
第一题:
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; }
相关文章推荐
- Effective C++——条款43(第7章)
- 一个用c++写的去注释的程序
- 变量名的力量(一)
- C语言实现Huffman树并计算带权路径长度
- C++语言里const修饰符和指针前后位置的作用、区别详解
- c语言命名空间,cin.get().cin.getline()
- VC++创建和调用dll
- 数据的4种逻辑结构与4种存储结构
- c++多继承布局
- c++多继承布局
- C/C++从入门到精通(入门、进阶、精通)
- 酷壳陈皓:如何学好C语言
- 结构体大小
- 酷壳陈皓:如何学好C++语言
- c++异或运算
- 替换字符串中空格算法
- C++技术点积累(4)——继承、多态、抽象类
- C++技术点积累(3)——对象初始化列表、运算符重载
- 单例模式C++实现
- c++find函数用法