关于数组与指针的应用及区别-针对字符串去左边多余的‘0’字符
关于数组与指针的应用及区别-针对字符串去左边多余的‘0’字符
燃烧NO1 发表于4年前
关于数组与指针的应用及区别-针对字符串去左边多余的‘0’字符
  • 发表于 4年前
  • 阅读 21
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: 数组与指针的应用及区别; 字符串去左边多余的‘0’字符

最近有一个需求:
  需要针对字符串去左边多余的‘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);
}

共有 人打赏支持
粉丝 24
博文 87
码字总数 67020
×
燃烧NO1
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: