c语言如何输入带\n和空格的字符串

目录

c语言如何输入带空格的字符串

c语言如何输入空格加回车的字符串


c语言如何输入带空格的字符串

例题引入~~

【题目内容】
编写程序,输入可能带空格的字符串,计算并输入其长度(即字符个数,含空格数)。
字符串最大长度不超过100。使用字符数组实现,不使用字符串库函数。
输入 : 可能带空格的字符串。
输出:一个非负整数,字符串的长度。
样例输入:
I like C++.
样例输出:
11

思路:这道题要使用数组储存输入的内容,判断数组中“有用的部分”,统计后输出即可

#include <stdio.h>
#pragma warning(disable:4996)//vs中这样输入避免scanf函数报错
int main()
{
	char a[100] = { 0 };
	scanf("%s", a);
	for (int i = 0; i <= 99; i++)
	{
		if (a[i] == 0 && a[i + 1] == 0 && a[i + 2] == 0)//这里取巧
		{     
			printf("%d", i);
			break;
		}
	}
	return 0;
}

如何判断数组中有用的部分呢,我们知道,这样对数组初始化后,全部内容均为\0,而我们取个巧,默认用户不会连续输入一堆空格。所以如果连续三个数组的元素都是\0,我们觉得这时就算有用的部分结束了。

看起来没毛病,那么我们跑一下试试(逝世)。

坏了,果然逝世了,输入“I like C++.”,结果竟然是1。这不就寄了。

哪里出问题了呢?

分析一波,看来a[1]=a[2]=a[3]均为零,肯定是输入出问题了。(你大可分步执行一下)

scanf遇到\0就会读取前面的内容,于是a[0]还正常的读入,scanf发现接下来一个是\0,就不干了,读取结束,循环结束,a[1]--a[99]全是\0。裂开了!

 如果我们死脑筋,非要用scanf进行输入,可以!有办法!

scanf("%[^\n]",str);

意思是:一直读取,直到遇见\n。

nice~~

看下结果

//I like C++.
//11

其实还可以用gets,但是c++认为gets不安全(我其实没遇到过),并且题目不让!!唉~

c语言如何输入空格加回车的字符串

例题引入~~

【题目描述】
设有一篇文章,有3行文字,每行不超过80个字符。请统计出该文的大写字母、小写字母、数字、空格以及其他字符的个数。使用字符数组实现,不使用字符串库函数。
输入:三行英文文字,可能有空格及数字、标点等符号。
输出:5个整数,用空格隔开,分别表示大写字母、小写字母、数字、空格以及其他字符的个数。
【输入输出样例】
输入:
year 2019
Month 3
DAY 20!
输出:
4 8 7 3 1

思路:由于scanf+%s没法输入二维数组(也可能是我菜不会用)。我们用三个一维数组实现。读入,判断,输出,简介明了。

#include <stdio.h>
#pragma warning(disable:4996)
int main()
{
	char w[80] = { 0 };
	char m[80] = { 0 };
	char n[80] = { 0 };
	int a = 0, b = 0, c = 0, d = 0, e = 0;
	scanf("%[^\n]", w);
	scanf("%[^\n]", m);
	scanf("%[^\n]", n);
	for (int i = 0; i < 80; i++)//对第二行和第三行就不展示在这里了,太浪费空间
	{
		if (65 <= w[i] && w[i] <= 90)
			a += 1;
		else if (97 <= w[i] && w[i] <= 122)
			b += 1;
		else if (48 <= w[i] && w[i] <= 57)
			c += 1;
		else if (w[i] == 32)
			d += 1;
		else
			if (m[i] != '\0')
				e += 1;
	}
	printf("%d %d %d %d %d", a, b, c, d, e);
	return 0;
}

对第二行和第三行的循环判断就不展示在这里了,太浪费空间

运行一波逝世

好家伙,我一个回车下去,直接结束程序了!!!

补充知识:

缓冲区

缓冲区是一块内存区, 它用在输入输出设备和CPU之间,用来缓存数据 。目的是为了CPU使其能够高效率工作。

你从键盘或是其他输入设备上输入的所有内容(包括换行\n和空格\0)都会放在缓冲区中,随后由编写的函数读取进入程序中,缓冲区一般不可见。

scanf

遇到\0,\n,tab都会选择停止从缓冲区读取。

当运行这个程序时,向缓冲区输入真正的内容是“year\02019\n”(回车即\n),第一个scanf读取了“\n”前的所有内容,然后保存到a中,第二个scanf也会选择读取了“\n”前的所有内容(啥也没有),第三个scanf也会选择读取了“\n”前的所有内容(啥也没有)。尴尬

下面给出n种办法供你选择~

scanf("%[^\n]\n", w);

scanf一直读取,直到遇到\n停止读取,然后把\n也读走。

注意:如果你输入“s\0s\n”,那么数组中分别为s,\0,s,\n.第四个是\n!!

scanf(" %[^\n]", w);

咳咳,我也解释不清,看下面的注意

注意:如果你输入“s\0s\n”,那么数组中分别为s,\0,s,\0.第四个是\0!!

scanf("%[^\n]", w);
getchar(); 

当你输入回车后,缓冲区还剩一个\n,getchar会读取任意一个字符(包括tab,\0,\n),清空缓冲区了。

注意:如果你输入“s\0s\n”,那么数组中分别为s,\0,s,\0.第四个是\0!!

 综合来讲,第二种方法最可靠,甚至你可以在其他离谱的情况下使用。

某无聊的例子:

#include <stdio.h>
#pragma warning(disable:4996)
int main()
{
	char a[100] = {0};
	scanf(" %s", a);
	printf("%s", a);
	return 0;
}

scanf在%s前加了个空格,并不影响使用(你可以不输入空格直接输入字符串,跟scanf前没有空格是一样的),跟我们通常认为的scanf即为严格的输入不太一致。

所以你如果够闲可以在每个scanf最前面都加上个空格,在缓冲区没有任何内容或者只有\n时是没有关系的。

总结:用scanf函数输入\n和\0,缓冲区最基本介绍。

我想,朋友,你也不想别人白嫖你的文章吧【手动滑稽】。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值