在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[n]先分配内存(C用malloc或C++用new),下面是最后的版本:
哈哈,最后的结果如下:
**********************************************************************************************
一晚上就搞了这么一个问题,不过很值得。终于完全弄懂C语言下的字符串了,再也不需要使用stringstream来回避它,哈哈~~~很享受这种慢慢的分析问题到最后解决问题的过程,nice~~~虽然原因现在看起来很2B~~~最后再声明一遍哈:
(1) 字符指针还是指针,它显的特殊,仅仅是因为%s的内部机制;
(2)对指针的操作前提是指针必须不是NULL。
**********************************************************************************************
首先来分析字符数组和字符指针:
输出结果如下:
字符型数组和字符型指针都是可以表示字符串的,它们的结尾处为'\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[n]先分配内存(C用malloc或C++用new),下面是最后的版本:
哈哈,最后的结果如下:
**********************************************************************************************
(1) 字符指针还是指针,它显的特殊,仅仅是因为%s的内部机制;
(2)对指针的操作前提是指针必须不是NULL。