首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >字符数组输入输出---fputs,gets_s,puts,fputs

字符数组输入输出---fputs,gets_s,puts,fputs

作者头像
大忽悠爱学习
发布2021-03-02 15:51:01
发布2021-03-02 15:51:01
75100
代码可运行
举报
文章被收录于专栏:c++与qt学习c++与qt学习
运行总次数:0
代码可运行

要点1

字符数组初始化: 1. 逐个字符初始化,如果不在结尾加\0,用%s输出会乱码

代码语言:javascript
代码运行次数:0
运行
复制
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void test()
{
	//初始化方式1
	char arr[5] = { 'a','b','c','d','c' };
	printf("%s\n", arr);

}
int main()
{
	test();
	return 0;
}

正确写法:

代码语言:javascript
代码运行次数:0
运行
复制
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void test()
{
	//初始化方式1
	char arr[5] = { 'a','b','c','d','c' };
	printf("%s\n", arr);
	for (int i = 0; i < 5; i++)
	{
		printf("%c ", arr[i]);
	}
	//正确写法
	char arr1[6]= { 'a','b','c','d','c','\0' };
	printf("\n%s\n", arr1);

}
int main()
{
	test();
	return 0;
}

推荐的初始化方式: 下面这种初始化方式,会自动在字符串后面加一个’\0’

char arr[20] = “大忽悠”;

代码语言:javascript
代码运行次数:0
运行
复制
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void test()
{
	//初始化方式2
	char arr[20] = "大忽悠";
	printf("%s", arr);
   
}
int main()
{
	test();
	return 0;
}

要点2

求字符串长度的函数strlen和sizeof区别:

  1. strlen不会包含\0的长度,并且遇到\0统计结束
  2. sizeof会包含\0的长度,并且遇到\0统计不会结束

要点3

scanf输入字符串时遇到空格会结束输入

解决上面问题需要用到: fgetsh或gets_s

代码语言:javascript
代码运行次数:0
运行
复制
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void test()
{
	//初始化方式2
	char arr[8] ;
	//gets函数因为不检测越界情况,一旦越界,就会报错
	//所以改用gets_s
	//即便写了大小,一旦输入超出,也不会检测,还是会溢出,报错
	gets_s(arr, 20);
	//或者可以用fgets,不光能向文件输入,也能像终端窗口输入
	//当往里面输入数据超出数组大小时,会自动删减,不会产生溢出
	//fgets(arr, sizeof(arr), stdin); //stdin标准输入流
	printf("%s", arr);  
}
int main()
{
	test();
	return 0;
}

puts或fputs

代码语言:javascript
代码运行次数:0
运行
复制
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void test()
{
	char arr[20]="大忽悠" ;
	//需要手动加换行符
	printf("%s\n", arr);
	//自动换行
	puts(arr);
	//stdout标准输出设备
	//不带换行符
	fputs(arr, stdout);
     
}
int main()
{
	test();
	return 0;
}

注意: gets函数与scanf函数比较 相同点:

都是从标准输入设备中接收。 接收的字符串结束之后都会自动在字符串的末尾追加’\0’作为字符串结束符。

不同点: gets函数:只把换行符作为结束分隔符,即gets函数可以接收空格(’ ‘)和制表符(’\t’). scanf函数遇到空格,制表符,换行符都会自动结束接收

两者对缓冲区中的回车符不同:

gets函数一遇到回车就结束,并把这个回车从缓冲区中移走 scanf函数在读非空白字符之前会忽略回车,在读取之后如果遇到空白字符会停止输入,并将其留在缓冲区里

如:输入\ndddd\n char sh; sh=(char)malloc(sizeof(char)); //scanf("%s",sh); gets(sh); printf(sh);

scanf函数会忽略第一个换行符,读取后面的字符串,当之后遇到换行符才结束输入 gets函数会在遇到第一个换行符时就结束输入 但是scanf输入结束时第二个换行符被留在缓冲区中 gets输入结束之后换行符也被读走了

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/02/13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 要点1
  • 要点2
  • 要点3
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档