原因:
在查找资料后发现,是因为字符数组末尾没有加上'\0'结束标识,程序无法判断字符数组是否读完,然后输出了字符数组全部内存,即“烫烫烫烫烫烫”;
一般使用字符串常量初始化字符数组会在末尾自动添加空值字符'\0',但在字符数组赋值,比如数组字符赋值给未初始化结构字符数组成员时,忽略末尾‘\0’,就可能会导致'烫'的出现。
如下代码块:
golf Golfa;
int i;
for (i = 0; i < Len; i++)
{
name[i] = cin.get();
if (name[i]== '\n')
{
//name[i] = '\0'; 未修改末尾字符就会出错
cout << "the enter end;\n";
break;
}
}
setgolf(Golfa,name, i+1);
//函数代码
void setgolf(golf& g, const char* name, int hc)
{
for (int i = 0; i < hc; i++)
{
g.fullname[i] = name[i];
}
}
解决方法:
1,在赋值给目标数组前,在赋值数组末尾添加‘\0’,(赋值时可能需要’\0‘的空间,要注意到下标);
for (i = 0; i < Len; i++)
{
name[i] = cin.get();
if (name[i]== '\n')
{
name[i] = '\0';
cout << "the enter end;\n";
break;
}
}
2,在赋值后,给目标数组末尾额外添加上‘\0'以结尾。
void setgolf(golf& g, const char* name, int hc)
{
for (int i = 0; i < hc; i++)
{
g.fullname[i] = name[i];
}
g.fullname[hc]='\0';
}
3,在创建结构时,在结构数组后添加“{}”花括号,表示已经初始化。
struct golf
{
char fullname[Len] {};
int handicap;
};
其中,方法三最简单,也最好理解,但在某些情况下并不适合。
//-----分割线-----//
附:3/13号遇到的问题:
Person::Person(const std::string& ln,const char * fn)
{
Iname = ln;
sizeof(fn);
int s;
//s = sizeof(fn) < LIMIT ? sizeof(fn) : LIMIT;
//for (int i = 0; i < s; i++)
// fname[i] = fn[i];
int i = 0;;
while (fn[i] != '\0')
i++;
if (i == 0)
{
std::cout << "Error.\nAnd set fname to NULL\n";
fname[0] = '\0';
}
else {
s = i < LIMIT-1 ? i : LIMIT;
for (int i = 0; i < s; i++)
fname[i] = fn[i];
fname[s] = '\0';//注意结尾
std::cout << "#测试#:sizeof是否包括\'\\0\' : " << fname[s-1] << std::endl;
}
}
使用数组输入比较长度时,可以测试sizeof()显示长度时,是否包括了末尾字符‘\0’。
结论是,sizeof( ) 并不包括末尾字符。
以及,该代码块中也展示了,怎么得到char数组的长度,(如果直接使用指针,只会返回指针的地址的长度),还是需要利用'\0'来得到长度,结尾注意还要添加末尾字符。