文档章节

关于数组与指针的应用及区别-针对字符串去左边多余的‘0’字符

01010101010101010101
 01010101010101010101
发布于 2014/01/03 21:26
字数 1019
阅读 21
收藏 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);
}

© 著作权归作者所有

共有 人打赏支持
01010101010101010101
粉丝 23
博文 93
码字总数 68915
作品 0
长宁
高级程序员
私信 提问
什么是指针

什么是指针 指针就就是数据的内存地址。 指针的作用一 当你需要在函数间传递大量数据时就用指针,因为可以降低的内存开销 指针的作用二 定义指针变量的格式 定义一个指针变量的方法 Examples...

5vinsEnt
2016/03/15
5
0
char *a 与char a[] 的区别

char *a = “hello” 中的a是指向第一个字符‘h’的一个指针 char a[20] = “hello” 中数组名a也是执行数组第一个字符‘h’的指针 但二者并不相同: 看实例:把两个字符串相加: 结果: 对比...

大黄有故事
2016/12/15
0
0
C语言中的字符串

1.字符串与字符数组 字符数组是一种数组,这中数组中的每个元素是一个字符型数据。 定义一个字符数组: 对已定义的字符数组进行赋值: 以上字符素组的存储为: 字符数组的初始化有两种方式:...

大道无名
2016/10/22
10
0
字符串匹配算法之"Boyer Moore"

Boyer-Moore字符串搜索算法是一种非常高效的字符串搜索算法。它由Bob Boyer和J Strother Moore设计于1977年,最初的定义1975年就给出了,后续才给出构造算法以及算法证明。 先假定部分定义:...

famince
2013/11/29
0
0
char *a 和 char a[ ]的区别

char *a = "hello" 中的a是指向第一个字符‘a'的一个指针 char a[20] = "hello" 中数组名a也是执行数组第一个字符‘h’的指针 但二者并不相同: 看实例:把两个字符串相加: 结果: 对比: ...

阿桑
2014/03/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

开发转测试七年,我从测试策略到测试架构(Test architecture)

程序员之间流传着这样一句顺口溜:有人喜欢创造世界,他们做了开发者;有的人喜欢开发者,他们做了测试员。什么是软件测试?软件测试就是一场本该在用户面前发生的灾难提前在自己面前发生了,...

程序猿拿Q
3分钟前
0
0
有用的大学课程

https://github.com/prakhar1989/awesome-courses https://github.com/EbookFoundation/free-programming-books https://github.com/Blankj/awesome-java-leetcode https://github.com/iluwa......

happyeveryday32
4分钟前
1
0
Can not deserialize instance of java.lang.String out of START_OBJECT token

Can not deserialize instance of java.lang.String out of START_OBJECT token 前端和后端对应得数据类型不一致,前端传得是对象中得一个类型是json,后端是字符串类型...

xiaomin0322
8分钟前
0
0
配置防盗链,访问控制

[toc] 配置防盗链,访问控制 11.25 配置防盗链 1.防盗链和referer概念 防盗链,通俗讲就是不让别人盗用你网站上的资源,这个资源指的是图片、视频、歌曲、文档等,在这之前需要理解一下refer...

夏为的Linux
9分钟前
0
0
理解CPU分支预测,提高代码效率

摘要: 技术传播的价值,不仅仅体现在通过商业化产品和开源项目来缩短我们构建应用的路径,加速业务的上线速率,也会体现在优秀程序员在工作效率提升、产品性能优化和用户体验改善等小技巧方...

阿里云官方博客
9分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部