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

C语言:将输入的字符串(char* cp)存入字符指针数组(char * spa[])

2015-07-22 14:17 555 查看
在C++下面读入string类型,存入vector中非常的简单。在C语言下面读入string倒是很简单,但是要存入指针数组中貌似费了很大的劲都不行。C还是四年之前看过,对于C下面的字符串一直很恐惧,今天下定决心,要好好研究一下






**********************************************************************************************
首先来分析字符数组和字符指针:



输出结果如下:



字符型数组和字符型指针都是可以表示字符串的,它们的结尾处为'\0';
一直在说数组名实际上是数组的首地址值,从这点可以看出scanf输出字符串的原理。因为字符型指针名传递的肯定是地址,所以scanf(“%s”)的原理肯定是找到所传递的地址处,挨个的输出地址中的字符,直到碰到'\0',认为字符串结束了。
下面可以做个小试验:



输出的结果如下:



实际上char型的数组和指针没有什么特殊的性质。它们的特殊之处仅仅在于,当碰到%s,它们表示为string时,系统知道'\0'表示结束。
**********************************************************************************************
再来分析指针数组:


 

弄明白上面的一点,这个的结果也很容易理解,如下:


 

感觉关键就在于"%s"这个选项上,它的机制就是找地址(注意是地址),然后输出,碰到'\0'结束。
**********************************************************************************************
为了将字符串存入字符型的指针数组中,首先先搞定将字符串存入字符指针中:


 

结果显而易见:



这里的原理和第一部分一样,%s的机理是从地址入手。
**********************************************************************************************
下面是关键了,将用户输入的字符串存入指针数组中。先模仿C++的思路,写一个显而易见的版本。



结果如下:


 

可以看第48行这里是一个指针之间的赋值,实际上传递的是地址值,所以字符指针数组中的每个值都是tmp的地址值,所以最后结果是一样的。
正确的方法应该是,改变charPointerArray中每一个元素所指的地址中的内容(字符串):
---------------------------------------------------------------------------------------------
使用strcmp可以对字符串的内容赋值,但是将地48行改成如下的形式,会报错:



会出现内存引用的错误:



可以思考一下这里是为什么?举个更加简单的例子来看:


 

这里也是会报内存引用出错。strcpy的作用机理是将huan[]的字符复制到chen中,直到'\0'为止。这里使用了一个未初始化的字符指针,编译器不知道该指针指向哪里,实际上就是一个NULL,对它的应用所以会报错。
下面可以做一个小测试,使用new为它分配一个地址,然后再来运行:



下面是运行的结果:



这里可以看出,只要不是NULL就可以了(废话了,NULL的引用必然出错。。。






所以之前会出现内存的引用出错,完全是因为使用了NULL,chen指向不知道的地址,strcpy也不知道往哪里赋值。
---------------------------------------------------------------------------------------------总结前面得到的两点,接下来就可以解决最开始提出来的问题:
(1)字符指针还是指针,它显的特殊,仅仅是因为%s的内部机制;
(2)对指针的操作前提是指针必须不是NULL。
所以想要将char* c的值存入char*
sp[]中,必须单独的为每个sp
先分配内存(C用malloc或C++用new),下面是最后的版本:



哈哈,最后的结果如下:


 

**********************************************************************************************
    一晚上就搞了这么一个问题,不过很值得。终于完全弄懂C语言下的字符串了,再也不需要使用stringstream来回避它,哈哈~~~很享受这种慢慢的分析问题到最后解决问题的过程,nice~~~虽然原因现在看起来很2B~~~最后再声明一遍哈:
(1)字符指针还是指针,它显的特殊,仅仅是因为%s的内部机制;
(2)对指针的操作前提是指针必须不是NULL。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: