运行环境:VC6.0
我们先来看下面的代码:
#include <stdio.h>
void main(){
char a[10]="I am a boy";
printf("%s\n",a); // I am a boy烫p
}
运行这段代码,使用printf
语句打印的时候,会发现有一堆奇怪的字符。
解决方法,手动添加\0
,示例代码如下:
#include <stdio.h>
void main(){
char a[11]="I am a boy\0";
printf("%s\n",a); // I am a boy
}
如果我们不定义字符串数组的长度也可以正常输出,示例代码如下:
#include <stdio.h>
void main(){
char a[]="I am a boy";
printf("%s\n",a); // I am a boy
}
下面是自己的猜测,没有严格的验证,我们都知道,字符串的输出是通过数组名找到其数组起始地址,然后逐个输出其中的字符,遇到字符\0
就停止输出。
我们先来看下面这两段代码:
#include <stdio.h>
void main(){
char a[11]="I am a boy\0";
printf("%s\n",a); // I am a boy
}
如果我们把\0
移动到字符串中的某个位置,示例代码如下:
#include <stdio.h>
void main(){
char a[11]="I am \0a boy";
printf("%s\n",a); // I am
}
回到我们一开始的问题,为什么会输出一堆奇怪的字符呢。很可能是编译系统并没有给我们加上\0
。这样子在输出的时候,就无法知道字符串到哪个位置结束了。所以我们最好还是手动添加上\0
,以免遇到奇奇怪怪的问题。
最后我们再来看这样一段代码
#include <stdio.h>
void main(){
char a[5];
scanf("%s",a); // China
/**
\0为字符串的结束标志,其ASCALL码为0
**/
if(a[5] == 0){
printf("字符串以\\0结束"); // 这里打印了字符串以\0结束
}
printf("%c",a[6]); // 无法预测的字符
}