gets输入字符串,其可以无限读取,不会判断上限,可以包含空格,以回车结束读取。

因为该函数可以无限读取,所以应该确保buffer(缓存)的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。

一、用%c循环输入直到遇到换行结束

int main()
{
	char str[100];
	char ch;
	int i=0;
	while(scanf("%c", &ch) && ch != '\\n')
	{
		str[i++] = ch;
	}
	str[i] = '\\0';    //手动把字符串末尾字符赋值成'\\0'
	//系统以'\\0'判断字符串结
	cout << str << endl;
	return 0;
}

二、用getchar()循环输入直到遇到换行结束

这个方法从原理是跟上面的方法是一样的,只是写法不一样,下面直接放上参考代码:(值得注意的是末尾仍要赋成'\0')

int main()
{
	char str[100];
	char ch;
	int i=0;
	while((ch = getchar()) != '\\n')
	{
		str[i++] = ch;
	}
	str[i] = '\\0';    //手动把字符串末尾字符赋值成'\\0'
	cout << str << endl;
	return 0;
}

三、c++中的getline()方法

string str;
int len=str.size();
getline(cin,str);