关于输出字符串出现“烫烫烫烫”的解决方法

原因:

在查找资料后发现,是因为字符数组末尾没有加上’\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’来得到长度,结尾注意还要添加末尾字符。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2023年12月12日
下一篇 2023年12月12日

相关推荐