您的位置:首页 > 其它

fgets()函数输入的长度,以及strlen()函数返回的长度问题

2016-10-25 15:30 441 查看
fgets()
函数输入的长度,
以及
strlen()
函数返回的长度问题,
在此做下测试(visual studio 2013):
#include<stdio.h.>
#include<string.h>

int main(void) {
char a[6];
printf("input:");
fgets(a, 6, stdin);

printf("%s\n", a);
printf("strlen() = %d\n", strlen(a));

return 0;
}

对于
a[6]
我们知道,只能装进
5 个有效字符,因为最后的
\0
结束符要占一个。
此例中,当我们输入的字符串的长度小于 6 时,程序运行:
input:123
123

strlen() = 4
请按任意键继续. . .

这里的
123
后面为什么多出一行空行,不知道什么原因,有谁能告诉我吗?还有
strlen()
函数输出得长度是
4 ,比有效字符多一个,
'\0
也算上了?
'\0'
被转化为换行
'\n'
了?
strlen()
会把
'\n'
算一个?有点诡异,不确定。
当输入的字符长度为 5 = (6 - 1) 的时候,程序运行:
input:12345
12345
strlen() = 5
请按任意键继续. . .

可见,这里的
strlen()
的输出长度为
5 ,其为有效字符串长度。这里和上次的测试不一样,什么原因谁能告诉我呢?
当输入的字符长度为 6 的时候,程序运行:
input:123456
12345
strlen() = 5
请按任意键继续. . .

当输入的字符串长度大于 6 的时候,程序运行:
input:123456789
12345
strlen() = 5
请按任意键继续. . .

书上对
gets()
函数是这么说的:

它可以读入包括空格符在内的字符串,用puts()输出时,将
\0
转化为换行符,因此
puts()
一次输出换一行,不用另外加换行符。

我想对
gets()
puts()
也一样吧。
把上面的程序改成
scanf()
输入:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h.>
#include<string.h>

int main(void) {
char a[6];
printf("input:");
//fgets(a, 6, stdin);
scanf("%s", a);

printf("%s\n", a);
printf("strlen() = %d\n", strlen(a));

return 0;
}

当输入的字符串小于6的时候,程序运行:
input:12345
12345
strlen() = 5
请按任意键继续. . .

input:123
123
strlen() = 3
请按任意键继续. . .

当输入的字符串长度大于等于6的时候,越界溢出出错,所以 visual studio 一直警告用
scanf_s()
函数替换它。
其实本来的`strlen()应该数出的长度是字符串的有效长度,不包括’\0’。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  笔记
相关文章推荐