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

 更新时间:2025年07月04日 09:43:40   作者:爱吃芝麻汤圆  
这篇文章主要介绍了c语言如何输入带\n和空格的字符串问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

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,缓冲区最基本介绍。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C# CLR学习 C++使用namespace实例详解

    C# CLR学习 C++使用namespace实例详解

    这篇文章主要为大家介绍了C# CLR学习 C++使用namespace实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • C语言商品销售系统源码分享

    C语言商品销售系统源码分享

    这篇文章主要为大家分享了C语言商品销售系统源码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • C语言time.h库函数的具体用法

    C语言time.h库函数的具体用法

    C语言的time.h头文件提供了一系列的函数和工具,用于处理时间和日期相关的操作,本文主要介绍了C语言time.h库函数的具体用法,感兴趣的可以了解一下
    2023-12-12
  • C语言 二叉查找树性质详解及实例代码

    C语言 二叉查找树性质详解及实例代码

    这篇文章主要介绍了C语言 二叉查找树性质详解及实例代码的相关资料,需要的朋友可以参考下
    2017-03-03
  • 使用Qt实现监听网页是否响应并导出Excel表

    使用Qt实现监听网页是否响应并导出Excel表

    Qt导出数据到excel,方法有很多,下面这篇文章主要给大家介绍了关于使用Qt实现监听网页是否响应并导出Excel表的相关资料,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • 基于C语言实现五子棋游戏

    基于C语言实现五子棋游戏

    这篇文章主要为大家详细介绍了基于C语言实现五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • php调用c++的方法

    php调用c++的方法

    这篇文章主要介绍了php调用c++的方法,需要的朋友可以参考下
    2014-01-01
  • 如何基于C语言socket编程实现TCP通信

    如何基于C语言socket编程实现TCP通信

    本文介绍了如何基于C语言socket编程实现TCP通信,下面小编来简单介绍下
    2019-05-05
  • 基于C语言扫雷游戏的设计与实现

    基于C语言扫雷游戏的设计与实现

    大家好,本篇文章主要讲的是基于C语言扫雷游戏的设计与实现,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • C语言编写多功能日历

    C语言编写多功能日历

    之前看到本站给大家分享了一则C语言实现的简单日历,就手痒了,也想自己写一个,既然有简单了,那咱写个稍微复杂点的,多功能的吧。呵呵,玩笑玩笑
    2015-03-03

最新评论