如何读取字符串中的空格(C语言)

1.getchar函数

函数原型:int getchar ( void );

这个函数不需要参数,返回值为整形,当发生读取错误时会返回EOF即-1;
但是对于这个函数只能每次读取一个字符,如何让他读取一个字符串呢?很简单,循环就好了

int main()
{
	char arr[30] = { 0 };
	char ch = 0;
	int i = 0 ;
	while ((ch = getchar()) != '\n')//只要输入没遇到回车一直读取字符
	{
		arr[i] = ch;
		i++;
	}
	printf("%s\n", arr);
	return 0;
}

这个代码核心就在每次读取一个字符但一直循环输入,只有遇到回车即换行符才会停止读入,但是调试后我们发现这个循环输入是一个字符一个字符输入的,很明显程序的效率不够高所以这并不是最优解。
运行结果如下:
运行结果

2.使用scanf单个字符读入

对于直接不加优化的使用scanf是无法读入带有空格的字符串的。所以我们的思路与上面一样,用循环输入每次只读取一个字符多次放入,设置一个结束读入的循环条件就能达到目的。

int main()
{
	char arr[30] = { 0 };
	char ch = 0;
	int i = 0 ;
	while (scanf("%c", &arr[i]) && arr[i] != '\n')
		i++;
	printf("%s\n", arr);
	return 0;
}

运行结果如下:
在这里插入图片描述
这里虽然我们达到了目的,但是我们发现输出后有俩次换行,我们明明只写了一个换行符?
其实,回车本质也是换行符(‘\n’),所以这种方法输入的时候会在字符数组的最后一个加上一个’\n’,这也是为什么我们发现有俩次换行。

3.fgets函数

函数原型:char * fgets ( char * str, int num, FILE * stream );

这个函数相对复杂些,有三个参数,str是字符指针型,他是我们要写入到字符串的目标地址,num是最大写入长度,代表能写入num-1个字符,stream是要从哪里写入,他是文件指针,所以这个函数文件的操作写入中用的比较多。换行符会让fgets这个函数停止读入,但是这个换行符也会被读入。这么讲解比较抽象,可能无法理解,在代码实际中去理解。

int main()
{
	char arr[30] = { 0 };
	fgets(arr, 30, stdin);
	printf("%s\n", arr);
	return 0;
}

这里我们要给arr数组写入一个字符串,最大29的字符(因为字符数组最后需要加’\0’,这个函数自动会加),stdin即标准输入,通俗的讲就是我们平时键盘上输入,如果需要从文件中读取,可以加上文件的名字。
运行结果如下:
在这里插入图片描述
很明显和上一个函数一样输出完后,自动换了俩行。就是因为他会自动读入换行符。但是相较于前俩种方法,这个一次就读到了我们想要的结果,这个程序运行的效率会相对高一些。

4.直接使用scanf

scanf并不是不能读入带有空格的字符,而是需要改动一下。

int main()
{
	char arr[30] = { 0 };
	scanf("%[^\n]s", arr);
	printf("%s\n", arr);
	return 0;
}

运行结果如下:
在这里插入图片描述
这里的%[^\n]s 是在限制输入,结果就是除了遇到换行符’\n’,否则会一直读入。可以理解为^异或’\n’,与’\n’不同的异或结果为真输入相同结果为0停止输入。显然这种输入法比前俩种更好。
注:
部分刚学习的小伙伴可能不知道异或(^)的概念可以不用这么理解,只要明白这么写的意思就是除了换行符其他都读入就够了
另外对于%[a-z]这种方式输入还有很多用法,这里没有详细讲解,有兴趣可以自行了解

5.gets函数(不推荐)

函数原型:char * gets ( char * str );

该函数参数是我们要写入的字符数组的地址,返回值是如果写入成功,返回该字符数组的地址。该函数遇到换行符就会停止读入,并且不会读入换行符。

int main()
{
	char arr[30] = { 0 };
	gets(arr);
	printf("%s\n", arr);
	return 0;
}

运行结果如下:
在这里插入图片描述
虽然这个函数达到了我们的目的,但是我们还是不推荐使用这个函数,为什么呢?
因为他并不会检查我们读入数据的多少而且我们自己也不能像fgets函数一样限定读入的多少,所以如果不注意很容易导致缓存区的溢出。
相信大家也看到了,代码在gets那警告,就是因为函数本身的缺点,很多编译器已经不支持这个函数了。
C 标准于 2011 年从其规范中明确删除了此功能。
该函数在 C++ 中已弃用(从 2014 标准开始)。
所以并不建议大家使用这个函数,尤其初学者一定要养成良好的编程习惯。

!!!本人第一次写博客,如果哪里有错误请指正,如果对大家有帮助请点个关注我会持续分享学习过程中不错的一些知识点。如果有任何看不懂的点可以留言区提问,看到后会第一时间回答的。感谢阅读,本人自己原创,请转载标明原处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值