C语言 字符串的输出,为什么输出那么多‘烫’呢?
#define maxsize 100
struct string{
char s[maxsize];
};
void init(struct string l){
int i;
for(i=0;i<maxsize;i++)
l.s[i]='\0';
}
void main(){
struct string l;
int i,j=0;
init(l);
for(i=0;i<3;i++)
scanf(" %c",&l.s[i]);
while(l.s[j]!='\0')
printf("%c",l.s[j++]);
} 展开
输出"烫烫烫烫"是因为vc会自动把未用函数的局部变量空间按字节全部初始化为CC。而定义的字符数组空间不够,所以就占用了那部分不属于自己的空间,因为cout输出char*是要遇到空字符才停止的,所以便把那些垃圾都打出来了。
即是说在最后没有字符串结束标志'\0'。
扩展资料
(1) 初始化内存和变量
包括用 0xCC 初始化所有自动变量,0xCD ( Cleared Data ) 初始化堆中分配的内存(即动态分配的内存 ),0xDD ( Dead Data ) 填充已被释放的堆内存(例如 delete ),0xFD( deFencde Data ) 初始化受保护的内存。
这样做的好处是这些值都很大,作为指针是不可能的(而且 32 位系统中指针很少是奇数值,在有些系统中奇数的指针会产生运行时错误),作为数值也很少遇到,而且这些值也很容易辨认,因此这很有利于在 Debug 版中发现 Release 版才会遇到的错误。
要特别注意的是,很多人认为编译器会用 0 来初始化变量,这是错误的(而且这样很不利于查找错误)。
(2) 通过函数指针调用函数时,会通过检查栈指针验证函数调用的匹配性(防止原形不匹配)。
参考资料来源:百度百科-字符串
输出"烫烫烫烫"是因为vc会自动把未用函数的局部变量空间按字节全部初始化为CC。
而定义的字符数组空间不够,所以就占用了那部分不属于自己的空间,因为cout输出char*是要遇到空字符才停止的,所以便把那些垃圾都打出来了。
即是说在最后没有字符串结束标志'\0'。
扩展资料:
字符串的函数应用
1、连接运算 concat(s1,s2,s3…sn) 相当于s1+s2+s3+…+sn.
2、求子串。 Copy(s,I,I) 从字符串s中截取第I个字符开始后的长度为l的子串。
3、删除子串。过程 Delete(s,I,l) 从字符串s中删除第I个字符开始后的长度为l的子串。
例:s:=’abcde’;delete(s,2,3);结果s:=’ae’
参考资料来源:百度百科-字符串
出现“烫”的原因是由于字符数组中的某些数组元素没赋值。
具体原因可以通过如下实例来进行说明:
char a[10];
a[0] = 'a';
a[1] = 'b';
a[2] = 'c';
a[3] = 'd';
printf("%s", a); // 输出结果就会出现很多“烫”,因为只对数组a中前四个元素进行了赋值,后面的元素未进行赋值,所以计算机默认就输出“烫”
如果作如下修改就会正常输出
char a[10];
a[0] = 'a';
a[1] = 'b';
a[2] = 'c';
a[3] = 'd';
a[4] = '\0';
printf("%s", a); // 输出abcd,因为加了结束字符'\0',而C语言中输出字符串是以结束字符'\0'作为结束输出的,所以只输出'\0'前面的所以字符,即abcd
#define maxsize 100
struct string{
char s[maxsize];
};
void init(struct string *l){
int i;
for(i=0;i<maxsize;i++)
l->s[i]='\0';
}
void main(){
struct string l;
int i,j=0;
init(&l);
for(i=0;i<3;i++)
scanf(" %c",&l.s[i]);
while(l.s[j]!='\0')
printf("%c",l.s[j++]);
}