最近有一个需求:
需要针对字符串去左边多余的‘0’字符(如帐号类型---银联批上次时会对帐号域进行左补'0'实现20位长的固定长度。如00000123451234567890gf ---->123451234567890);
于是去以前的代码里去翻找是否有这样功能的函数。结果发展了去左右空格的函数如:
void Rtrim(char *p)
{
int n, i;
n = strlen(p);
for (i = n; i > 0; i--)
{
if (p[i - 1] == 0x20)
{
p[i - 1] = 0x00;
}
else
break;
}
return;
}
void Ltrim(char *p)
{
while (*p == 0x20)
p = p + 1;
return;
}
--------------------------------------------------------------------------
于是我依样写了如下函数:
char* Lzero(char *p)
{
while (*p == '0')
p = p + 1;
return p;
}
来完成我的所需要的功能。并进行测试如下:
localhost.localdomain@/home/term/src/test>>cat test.c
#include<stdio.h>
#include<string.h>
char* Lzero(char *p)
{
while (*p == '0')
p = p + 1;
return p;
}
int main()
{
char str[32]="00000123451234567890";
Lzero(str);
fprintf(stderr, "str =[%s]\n", str);
return 0;
}
结果:
localhost.localdomain@/home/term/src/test>>make test
cc -o test test.c -O -DUNIX -DDEBUG -DTRACE_FILE='"./trace"' -D__PATH__='"/home/term/src/test/"'
localhost.localdomain@/home/term/src/test>>./test
str =[00000123451234567890]
-------------------------------------------------------------------------------------
于是我便对这代码进行相应的修改如下:
localhost.localdomain@/home/term/src/test>>cat testZero.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int Lzero(char *p)
{
while (*p == '0')
p = p + 1;
fprintf(stderr, "in Lzero p =[%s]\n", p);
return 0;
}
char* Lzero1(char *p)
{
while (*p == '0')
p = p + 1;
fprintf(stderr, "in Lzero1 p =[%s]\n", p);
return p;
}
int Lzero2(char *p, char **q)
{
while (*p == '0')
p = p + 1;
*q= p;
fprintf(stderr, "in Lzero2 p =[%s]\n", p);
return 0;
}
int Lzero3(char **p )
{
while (**p == '0')
*p = *p + 1;
fprintf(stderr, "in Lzero3 p =[%s]\n", *p);
return 0;
}
int main()
{
char *p ;
char str[21]="00000123451234567890";
fprintf(stderr,"org str = [%s]\n", str);
fprintf(stderr,"------------------------\n");
Lzero(str);
fprintf(stderr,"Used Lzero str = [%s]\n", str );
fprintf(stderr,"------------------------\n");
fprintf(stderr,"Used Lzero1 str = [%s]\n",Lzero1(str));
fprintf(stderr,"------------------------\n");
p = str;
Lzero2(str, &p);
fprintf(stderr,"Used Lzero2 str =[%s], p=[%s]\n",str,p );
fprintf(stderr,"------------------------\n");
p = str;
Lzero3(&p);
fprintf(stderr,"Used Lzero3 str= [%s], p =[%s]\n", str, p);
fprintf(stderr,"------------------------\n");
/* Lzero3(&str);
fprintf(stderr,"Used Lzero3 str= [%s]\n", str);
fprintf(stderr,"------------------------\n");
*/
return 0;
}
结果如下:
localhost.localdomain@/home/term/src/test>>make testZero
cc -o testZero testZero.c -O -DUNIX -DDEBUG -DTRACE_FILE='"./trace"' -D__PATH__='"/home/term/src/test/"'
localhost.localdomain@/home/term/src/test>>./testZero
org str = [00000123451234567890]
------------------------
in Lzero p =[123451234567890]
Used Lzero str = [00000123451234567890]
------------------------
in Lzero1 p =[123451234567890]
Used Lzero1 str = [123451234567890]
------------------------
in Lzero2 p =[123451234567890]
Used Lzero2 str =[00000123451234567890], p=[123451234567890]
------------------------
in Lzero3 p =[123451234567890]
Used Lzero3 str= [00000123451234567890], p =[123451234567890]
------------------------
=====================================================
总结:(参考高级质量C/C++编程)
1:首先需要牢牢的记住一个概念,指针只是一个指向而已。不能用sizeof来计算一个指针所指向的内存空间。
2:数组与指针有很多相似之处但是需要明白以下二点:
1)数组要么在静态存诸区(如全局数组),要么在栈上被创建。数组名对应着(而不是指指向)一块内存区。其地址与容量在生命周期内保持不变,只有数组的内容能改变。
2)指针可以随时指向任意类型的内存块,它的特征是"可变“, 所以常用指针来操作内存。
3:指针具有四大属性:如char *p=“1234567890”
1)指针类型:char* 。
2)指针所指的类型:char。
3) 指针的地址:指向某段内存的首地址,即字符'1'的地值。
4)指针本身所占内存的大小, sizeof(p) == 4。
4:编译器总是要为函数的每个参数制作临时副本,指针参数 p 的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p (所指向内存)的内容,就导致参数 p 的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p 申请了新的内存,只是把_p 所指的内存地址改变了,但是 p 丝毫未变。
如下:
void GetMemory(char *p, int num)
{
p = (char *)malloc(sizeof(char) * num);
}
void Test(void)
{
char *str = NULL;
GetMemory(str, 100); // str 仍然为 NULL
strcpy(str, "hello"); // 运行错误
}
-------------------------->>>>>需要改成:
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);
}
void Test2(void)
{
char *str = NULL;
GetMemory2(&str, 100); // 注意参数是 &str,而不是 str
strcpy(str, "hello");
cout<< str << endl;
free(str);
}