读书人

请问关于字符串fgets()函数

发布时间: 2012-06-20 20:37:21 作者: rapoo

请教关于字符串fgets()函数
书上说fgets(a,sizeof a,stdin)里面fgets()函数读取的字符数比第二个参数指定的字符数大1。输入结束时会在末尾添加\n和\0。

那如果

char a[10];
fgets(a,sizeof a,stdin);

比如我输入0123456789一共10个字符,printf("%s",a)的结果显示是012345678,我理解应该是a的长度是10,最后一个字符肯定是\0,能存储的有效字符只有9个,所以会显示012345678,而当我输入012345678的时候显示结果就是012345678。我这样理解对吗?

可按书上的说法应该是读入sizeof a+1个字符吧?可是a[10]的长度不是10吗?就是说会读入11个字符?那会如何存储?难道不会发生越界?

既然说该函数结束时会在末尾添加\n和\0,可是a的长度是10的话,存储的能够显示的字符应该是8个吧?那是不是printf("%s",a)的结果应该是01234567?

自己感觉好有点糊涂,请好心人指教

[解决办法]
char * fgets ( char * str, int num, FILE * stream );
<cstdio>
Get string from stream

Reads characters from stream and stores them as a C string into str until (num-1) characters have been read or either a newline or a the End-of-File is reached, whichever comes first.
A newline character makes fgets stop reading, but it is considered a valid character and therefore it is included in the string copied to str.
A null character is automatically appended in str after the characters read to signal the end of the C string.
注意看红色的部分
首先读取的字符数是n-1个,因为最后有一个'\0'自动追加,所以要留一个位子。
fgets只追加'\0',不会追加'\n' 是在你的输入的时候在读到n-1个字符之前碰到了回车'\n',那么fgets会停止,完成一次读取。然后特意注明了这个'\n'也会被复制到目标字符串中.
也就是说
1) 回车符不是想'\0'一样自动追加的,而是你要输入才有,你没输入就没有。
2) 这个回车符要想起作用,也就是被复制到字符串中还要满足一个前提,那就是在读到n-1个字符之前,否则就不会读到字符串中。

在以下测试代码中,输入012345678 正好9个字符(n-1=10-1=9),那么这就个字符都可以保存起来,注意此时的回车'\n',已经在读到n-1个字符之后了,不会在写入到字符串中
如果输入01234567 然后回车,那么结果就是01234567'\n',回车会包含进来。
你可以通过结果看出一个有换行,一个没有换行。

C/C++ code
#include <stdio.h>int main(void){    char a[10];    fgets(a,sizeof(a),stdin);//    printf("%s",a);        printf("---------------\n");    return 0;} 

读书人网 >C语言

热点推荐