这应该是我的第一篇文章关于我在写代码的过程中出现的问题,以后的话,这个栏目还是会继续更新的,随着我的代码越写越多,这种文章肯定不会少的,为了能够一眼看出来,这篇文章到底是什么类型的错误,标题名字,就不弄的那么没头没脑的了,就不按照顺序来编标题了。
在写代码的过程中,我是时不时会遇到一些问题,但是,仔细想想,其实这些也是我应该注意到的细节。 在关于一篇文章中就这文章里面,关于strncat的while循环那段纠结了半天,但是在想,到底是什么原因,导致了我这个代码居然什么都显示不出来?这时候,我陷入了沉思,但是其实,除了while的循环,我也应该没什么地方错了,当我把里面的改为==*arr1++!=‘0’的时候==意外的发现了程序居然运行成功了,那么我就开始思考,到底是什么为什么,难道while循环的条件,不是判断里面的内容是否为真还是假吗? 然后我搜索了一下while,大概就是下面这段,展示的是while的进行流程。
那,看到这里,我情不自禁的想起来我在原来的函数里面,写的是什么?我写的好像是直接 *arr1,但是,原本那段数组是字符串,最后的位置是’\0‘而不是0,那我这就开始怀疑,有了疑问。
关于我以为0和‘\0’其实是差不多的,因为在ASCII码表里面0的位置就是‘\0’。但是,其实真正一样的其实是数字0和字符‘\0’而不是字符0和‘\0’,还是得注意一下的。字符0的ASCII码值是48,和‘\0’完全不同。 所以千万不能把这几个长得像0的给弄混淆了,一定要在循环里面真正的理解每一个的含义,不然一不小心,都会成为死循环,或者说错误的结果。 下面就是一段例子,通过这个代码来理解一下,数字0转化为‘\0’的过程。
char* mystrncat(char* dst, const char* src, size_t n)
{
char* tmp = dst;
while (*dst)
{
dst++;
}
int i;
for (i = 0; src[i] && i < n; i++)
{
dst[i] = src[i];
}
dst[i] = 0;//这里是数字0也就相当于是‘\0’
return tmp;
}
int main()
{
char arr1[10] = "asc";
char arr2[] = "asd";
char* ret = mystrncat(arr1, arr2,2);
printf("%s", ret);
return 0;
}
其中的那段话,就是运用了数字0变为终止的‘\0’。
结果也同样是正确的。