当前位置:编程学习 > C/C++ >>

关于c语言的一道题的疑问

#include <stdio.h> #include <string.h> int main() { char str[10],c='a'; int i=0; for(;i<5;i++) str[i]=c++; printf("%s",str); return 0; } 为什么答案是不确定? 依据题目str[i]前五个数组元素分别被赋予了abcde,但是str数组长度为10,那么从第6位到第10位应该都为0,那么第6位的0就应该为’/0‘也就是结束符。 那为什么答案不是abcde?
追问:str[10]={a,b,c,d,e};
那么后面5位没有予以赋值的数组元素系统不是会自动赋值为0嘛?对阿。那第6到第10为系统就自动置零了不是嘛。那第6位的零不就是/0,结束符嘛?不是初始化的话,那么对第一位到第五位赋值的过程应该成为什么呢?
答案:我给解释下,首先你的str[10]只是申请没有初始化,所以系统会自动为你分配一些意想不到的值,当你执行
for(;i<5;i++)
str[i]=c++;
这句时,系统将str的前五个变为a,b,c,d,e,但是其余五个还是意想不到的值,所以输出时会有其他的值。
如果你在开始的建立str时初始化,将其变为char str[10]={'a','b'}那么,系统就会自动为其加上‘\0'
不知道这种解释你觉得是否满意
其他:谁说第6位到第10位是0。 str[10]没有初始化啊,系统随机分配的内存,里面原来不一定有什么呢,不一定为0.
要想为0,应该初始化时这么写:
char str[10] = {0}; 

你一定要明白初始化和赋值的区别 没有初始化的局部变量的值是随机的,所以第六位的值是随机的。
程序里面的for循环后数组的前五位给定了”abcde“,但是没有字符串的结束标志'\0',在使用printf输出时,是以'\0'作为结束标志的,否则就一直输出。

如果数组有初值,比如str[10]={a,b,c,d,e};那么会自动将str[5]赋值为'\0'(数组内容为a  b c d e \0),即数组结束标志,这样就可以用printf输出了。

对字符串的操作都需要注意是否保持多一位的结束字符。 

上一个:C++背包问题
下一个:int prime(int n){ int i,x=(int)sqrt(n); while(i<=x){ if(n%i==0)break;i++;} 的功能

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,