博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于数组与指针的应用及区别-针对字符串去左边多余的‘0’字符
阅读量:6957 次
发布时间:2019-06-27

本文共 4207 字,大约阅读时间需要 14 分钟。

  hot3.png

最近有一个需求:

  需要针对字符串去左边多余的‘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);
}

转载于:https://my.oschina.net/3pgp/blog/189943

你可能感兴趣的文章
【模式匹配】Aho-Corasick自动机
查看>>
ExtJs尝下鲜
查看>>
Nginx配置性能优化
查看>>
Atitit.判断元素是否显示隐藏在父元素 overflow
查看>>
SharePoint 2013 激活标题字段外的Menu菜单
查看>>
Java的异步HttpClient
查看>>
关于android中调用系统拍照,返回图片是旋转90度
查看>>
jQuery页面加载初始化的3种方法
查看>>
python常见环境安装
查看>>
生成随机唯一号码, 比如订单号
查看>>
ETHERNET帧结构
查看>>
CentOS7安装Hadoop2.7完整流程
查看>>
GIT的API主要应用示例
查看>>
directx11编程中遇到的错误及解决方法
查看>>
Java MongoDB
查看>>
python视频教程大全集下载啦
查看>>
项目相关的风险要素及分类
查看>>
[改善Java代码]子列表只是原列表的一个视图
查看>>
20个可能你不知道Linux网路工具
查看>>
李洪强漫谈iOS开发[C语言-031]-逻辑短路
查看>>