指针数组字符小问题

来源:百度知道 编辑:UC知道 时间:2024/06/05 04:50:11
#include<stdio.h>
#include<stdlib.h>
main()
{
char *p, s1[14], s2[14];
int i;

p="I love china!";
for(i=0;i<=12;i++,p++)
s1[i]=*p+1;
s1[i]='\0'; //这里在这输入这个有什么用吗???不输入不是也可以?
printf("%s",s1);
printf("\n");

for(i=0;i<=12;i++)
s2[i]=*(s1+i)-1;
s2[i]='\0';//这个为什么没了就会出错呢?
printf("%s",s2);
printf("\n");

system("pause");

}
还有请详细看我说的问题。第一个没有的话。程序不会出任何错误。而第二个没有的话会出错。
我需要详解。一楼的说的,我也知道。就是不懂才来问的
二楼指的灾难性的结果是???比如说这是能不能帮我分析一下???我需要的是过程。不是答案。
答案我有很多方法可以实现

我刚才在我的机器上运行了一下,没有出现错误。
只是要是第一个"\0"不加的话,在打印第一个字符串的时候后面都会出现一些乱码,第二个打印正常。
第二个"\0"不加的话,打印第二个字符串的时候后面会有一些乱码
结果不同应该是机器不同,对于内存的分配不同造成的吧
"\0"就是作为一个字符串的结束符,要是不加"\0"的话,就会一直向下打印已知到找到结束符为止,你的出现了错误应该是在打印的时候使用了一些不应该调用的内存吧,当然调用不属于你的程序分配的内存是很危险的一件事情,应为这块内存可能放置的是系统重要的数据,所以可能会发生灾难性的结果啊

不输入'\0' 是不对的 printf("%s",s1); 它输出字符串到'\0'结束 没有结束符会出错

s1[i]='\0';
如果没有这样的语句的话,那么以串输出的时候就会一直到把数组输出完为止。
因为你后面的还没有定义,所以输出的字符是不确定的。这也就是你说的错误吧!

C语言 在内存中字符串以'\0'为结束标志,系统遇到'\0'认为字符串结束。如果没有'\0',便会出错。

在你的加密和解密的过程中
由于你分配的空间够大
上面的不加'\0',理论上没错但是实际上还是有错
这个其实是这样的 你申请了14个char型的空间
实际上由于内存中的自动对齐 他实际可以存储16个(具体参考内存对齐方面)
而你在加密玩以后 如果不加'\0',后面的空间就自动填满,往往出现烫或者屯
等(这个主要是由于在内存分配中没有实际分配的空间的地址是0XCC或者0XCD开始存储的 cccc和cdcd对应的就是烫和屯)。
下面的不加'\0'和上面其实是一样的,只是编译器不同 结果不同。
在我的机器上 不加也没问题。