ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C语言字符串的输入函数

2022-07-02 20:34:29  阅读:204  来源: 互联网

标签:换行符 函数 puts C语言 char fgets words 字符串 gets


C语言字符串的输入函数

scanf()

// 声明
int scanf(const char *format, ...)

scanf()遇到非空白字符输入结束,即一次只能读取一个单词。

gets()

// 声明
char *gets(char *str);

gets()stdin读取整行输入,直到遇到换行符(丢弃换行符,储存其余字符,在末尾添加\0),与puts()配对使用。

但是gets()唯一的参数是str,不能检查数组能否容纳输入内容,如果输入内容过长,会导致缓冲区溢出,多出的字符可能擦除程序中的其它数据,导致程序异常。

fgets()

// 声明
char *fgets(char *str, int n, FILE *stream)

fgets()函数多用于处理文件的输入,可以通过第二个参数限制读入的字符数,如果该参数的值为\(n\),则fgets()将读入\(n-1\)个字符,或者在这之前遇到第一个换行符停止

注:

  • fgets()读到的第一个换行符会将其储存在字符串中;

gets()会丢弃换行符

输出时,gets()常与puts()配对使用,puts()会在字符串末尾添加换行;

fgets()与fputs()配对使用,fputs()不会添加换行;

  • fgets()的第三个参数表示读入的文件,也可以是键盘输入stdin

下面引用一个C Primer Plus中的一个例子加以解释

# include "stdio.h"

# define STRLEN 10

int  main()
{
	char words[STRLEN];

	puts("Enter strings(empty line to quit:)");
	while (fgets(words, STRLEN, stdin) != NULL && words[0] != '\n')
	{
		fputs(words, stdout);
	}
	puts("Done.");

	return 0;
}

这个程序可以读入超过10个字符的字符串:每一次循环读入9个字符以\0结束,然后再次循环,从剩余的字符中再一次读取9个,直到遇到\n,因为fputs()不会添加换行,因此输入的字符串最后在同一行输出。(由于输入时fgets()在结尾添加了\n,因此输出所有字符后光标移至下一行开头)

如果不想去掉fgets()保留的换行符,可以通过以下代码实现,

先遇到换行符,将其替换为\0

如果遇到空字符,丢弃剩余字符

# include "stdio.h"

# define STRLEN 10

int  main()
{
	char words[STRLEN];
	int i = 0;

	puts("Enter strings(empty line to quit:)");
	while (fgets(words, STRLEN, stdin) != NULL && words[0] != '\n')
	{
		while (words[i] != '\n' && words[i] != '\0')
		{
			++i;
		}
		if (words[i] == '\n')
		{
			words[i] = '\0';
		}
		else
		{
			while (getchar() != '\n')
			{
				continue;
			}
		}
		puts(words);
	}
	puts("Done.");

	return 0;
}

gets_s()

// 声明
char *gets_s(char *str, int n)

fgets()相比,gets_s()只能从标准输入中读取字符,并且读取到换行符会丢弃

如果读取到最大字符数也没有遇到换行,则会返回NULL

自定义输入函数……

标签:换行符,函数,puts,C语言,char,fgets,words,字符串,gets
来源: https://www.cnblogs.com/Euler-0525/p/16438498.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有