C语言笔记:字符串函数及字符串的几种输入和输出

一、输入输出的几种函数的选用

1.gets(),puts()

gets():
读取整行输入,直至遇到换行符,丢弃换行符,储存其余字符,并在末尾添加空字符。
但是它无法检查数组是否装得下字符串,如果字符串过长,会导致缓冲区溢出,有可能擦写掉程序中的其他数据,导致程序异常终止;
在C11标准中废除了此函数。
puts():
参数:字符串的地址。
遇到空字符就停止输出。

一个例子,gets()读到文件结尾会返回空指针。对空指针求值为0便可结束循环:

while(gets(line))
	puts(line);

2.fgets(),fputs()

fgets(word,stlen,stdin)

参数2:读入字符的最大数量,可读入stlen-1个字符,或读到遇到的第一个换行符为止。
参数3:要读入的文件,如果读入从键盘输入的数据,以stdin作为参数。
fgets()把换行符放在字符串的末尾,通常与fputs()配对使用。

fputs(word,stdout)

参数2:要写入的文件,如果要显示在计算机显示器上,以stdout作为参数。
与puts()的区别:puts()会在末尾添加换行符,而fputs()不会。

fgets()返回指向char的指针,返回的地址与传入的第一个参数相同,如果读到文件结尾,则返回NULL。

将换行符替换成空字符:

while(word[i] != '\n')
	i++;
word[i] = '\0';

清空留在输入行的字符串:

while(getchar() != '\n')
	continue;

3.gets_s()

gets_s()与fgets()的区别:

  • gets_s()读到换行符不会储存它
  • 不需要第三个参数
  • 若读到最大字符数都没有读到换行符,会先把目标数组中的首字符设置为空字符,读取并丢弃随后的输入直到读到换行符或文件结尾,然后返回空指针。接着调用依赖实现的处理函数,可能会终止或退出程序。

4.s_gets()

用来替换gets(),作为fgets()的补充,但错误输入时无反应。

char *s_gets(char *st,int n)
{
	char *ret_val;
	int i = 0;
	
	ret_val = fgets(st, n, stdin);
	if(ret_val)
	{
		while(st[i] != '\n' && st[i] != '\0')
			i++;
		if(st[i] == '\n')
			st[i] = '\0';
		else
			while(getchar() != '\n')
				continue;
	}
	return ret_val;
}

5.scanf(),printf()

对于输入结束:

  • %s:以下一个空白字符(空行、空格、制表符、换行符)作为字符串的结束;
  • %10s:读取10个字符或读到第一个空白字符后结束。
    第二次调用scanf()时,从上一次调用结束的地方继续读取数据。

二、字符串函数

string.h

1.strlen()

用于统计字符串的长度。
一个例子,用于缩短字符串的长度:

void fit(char *string, unsigned int size)
{
	if(strlen(string) < size)
		string[size] = '\0';
}

但上述后面的字符仍在缓冲区内,可用puts(string + n)把n位之后的字符串打印出来。

2.strcat()和strncat()

用于拼接字符串。
strcat()接受两个字符串作为参数,把第二个字符串的备份附加在第一个字符串的末尾,并把拼接后形成的新字符串作为第一个字符串,第二个字符串不变。
strcat()的类型是char *,函数返回第1个参数,即拼接后的新字符串地址。
如果第一个数组的空间不够容纳第二个字符串,会造成内存溢出,所以需要使用strncat()的第3个参数来指定最大添加字符数.例如

strncat(str1,str2,n);

这样在加到第n个字符或遇到空字符时停止。
n变量的值可通过以下计算:

char str1[str1size];

s_gets(str1, str1size);
n = str1size - strlen(str1) - 1;
strncat(str1, str2, n);
puts(str1);

注意:要给拼接后的字符串长度加1才够空间存放末尾的空字符

3.strcmp()和strncmp()

用来比较两个字符串的内容,如果参数相同返回0,否则返回非零值。
如果在字母表中第1个字符串位于第2个字符串前面,返回负数,反之返回正数;
因为在ASCII中,大写字母在小写字母前面,所以(‘大写’,‘小写’)返回的是负值。
空字符在ASCII中排第一,任一字符一定在它后面,对于ASCII值,若(str1,str2)中str1的值更靠后,则返回正数,反之返回负数。

而strncmp()在比较时,可以只比较第3个参数指定的字符数。

4.strcpy()和strncpy()

用来拷贝整个字符串,相当于字符串赋值运算符。
strcpy()第2个参数指向的字符串被拷贝至第1个参数指向的数组中,拷贝出来的字符串被称为“目标字符串”,最初的字符串被称为“源字符串”。
拷贝时需要确保目标数组有足够的空间容纳源字符串的副本。
注:声明数组将分配储存数据的空间,而声明指针只分配储存一个地址的空间。

由于参数为字符串指针,故可用来拷贝数组的一部分。
注:strcpy()会把源字符串中的空字符也拷贝在内,并覆盖掉数组中对应位置的值。

strncpy()函数的第三个参数指明可拷贝的最大字符数。
一般把此参数设置为比目标数组大小少1,然后把数组最后一个元素设置为空字符,以确保储存的是一个字符串。

strncpy(qwords[i], temp, TARGSIZE - 1);
qwords[i][TARGSIZE - 1] = '\0';

5.sprintf()

此函数声明在stdio.h中,和printf()类似,但它是把数据写入字符串,而不是打印在显示器上,因此该函数可以把多个元素组合成一个字符串。sprintf()第一个参数是目标字符串的地址,其余和printf()相同。

sprintf(formal, "%s, %-19s: $%6.2f\n", last, first, prize);

6.strchr(),strpbrk(),strrchr(),strstr()

char *strchr(const char * s, int c);
char *strpbrk(const char * s1, const char * s2);
char *strrchr(const char * s, int c);
char *strstr(const char * s1, const char * s2);

strchr():
如果s字符串中包含c字符,该函数返回指向s字符串首次出现的c字符的指针,若未找到c字符,则返回空指针。
strpbrk():
如果s1字符中包含s2字符串中的任意字符,该函数返回指向s1字符串首位置的指针;如果在s1字符串中未找到任何s2字符串中的字符,则返回空字符。
strrchr():
该函数返回s字符串中c字符的最后一次出现的位置(包括末尾的空字符),若未找到则返回空指针。
strstr():
该函数返回指向s1字符串中s2字符串出现的首位置。如果在s1中没有找到s2,则返回空指针。

例子,代替以上s_gets()函数:

char line[80];
char * find;

fgets(line, 80, stdin);
find = strchr(line, '\n');
if(find)
	*find = '\0';

(参考:C Primer Plus)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值