user-0 提问: C语言函数 strlen

回复:
user: user-1
content: 这是个常见的问题。 1. 用fgets读出的内容，通常都带着换行符； 2. 在fgets(buf, sizeof(buf), fp)之前初始化buf是个很蛋疼的做法； 3. 遇到这种问题，把buf按字节打印出来，一切问题都会真相大白，这是最基本的调试方法。

user: user-2
content: 如果文件内容就是123那么串长就应该是3啊，有空格的话应该就不一样了！

user: user-3
content: buf中多了个'\n'

user: user-4
content: 楼上的各位观众 别说什么没初始化了行嘛 fgets 毫无疑问会添加字符串结束的 \0 有没有初始化没什么影响  打开 1.txt 然后用ctrl+a 全选之后检查有没有换行 用 %d 输出 buf 看看读取到什么数据

user: user-0
content: 引用 10 楼 wenpinglaoyao 的回复:应该不关buf是否初始化的事，以下是我的机器运行结果—— #include "stdio.h" #include "string.h" #include "windows.h" FILE *sp;  char *p = "123"; void main() {     char buf[100]; 	if( (sp = fopen("1.txt","r")) == NULL) 		exit(1);  	while( fgets(buf,100,sp) != NULL ) 		printf("buf = %d\n",strlen(buf));  	printf("p = %d\n",strlen(p)); 	fclose(sp); 	scanf("%c",&buf[2]); } 以上是源代码，运行结果都是3，跟楼主的不一样，buf不是4【我的记事本里也只有“123”这些内容】  我用的是linux下的运行，你好像是微软的

user: user-5
content: strlen计算的是从第一个字符开始，直到遇到结束符'\0'，计算有问题的就是没有正确的结束符。给buf初始化就好了

user: user-6
content: 那是因为使用fgets会在最后，'\0'之前加一个'\n'，所以'\0'之前就是4个字符了。

user: user-7
content: 引用 2 楼 cutmelon 的回复:再看看你的代码，还存在一个问题，你的buf没有初始化，直接读3个字节之后，buf[3]不见得是0，所以你的strlen(buf)是个危险的家伙一语中的，也就是说fgets是否自动添加终结符（'\0'），这是一个需要确认的问题。

user: user-8
content: 一是自己分配的内存需要初始化。这是个好习惯。虽然不一定出问题，但出问题查起来就很麻烦。  二是，如果 123.txt 不止一行文字，那么fgets() 获取一行的字符串时后面是有个换行符和字符串结束符的。如果只有一行只有三个字符123，那么长度应该是3。

user: user-9
content: 跟踪下fgets(buf, 100, fp)这个函数获得buf内容就知道了

user: user-3
content: 引用 12 楼 SEESEECN 的回复:[quote=引用 9 楼 mujiok2003 的回复:] buf中多了个'\n' 应该是源文件的问题吧。跟buf的初始化没关系。msdn上有解释[/quote] 没有说跟初始化有关。  char * fgets ( char * str, int num, FILE * stream );  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 the end-of-file is reached, whichever happens first.   A newline character makes fgets stop reading, but it is considered a valid character by the function and included in the string copied to str.   A terminating null character is automatically appended after the characters copied to str.

user: user-10
content: 引用 9 楼 mujiok2003 的回复:buf中多了个'\n' 应该是源文件的问题吧。跟buf的初始化没关系。msdn上有解释

user: user-11
content: 引用 10 楼 wenpinglaoyao 的回复:应该不关buf是否初始化的事，以下是我的机器运行结果—— #include "stdio.h" #include "string.h" #include "windows.h" FILE *sp;  char *p = "123"; void main() {     char buf[100]; 	if( (sp = fopen("1.txt","r")) == NULL) 		exit(1);  	while( fgets(buf,100,sp) != NULL ) 		printf("buf = %d\n",strlen(buf));  	printf("p = %d\n",strlen(p)); 	fclose(sp); 	scanf("%c",&buf[2]); } 以上是源代码，运行结果都是3，跟楼主的不一样，buf不是4【我的记事本里也只有“123”这些内容】 呃，fgets是用来读字符串的吗？很久没用这套函数，都忘了，习惯用系统提供的api按字节处理

user: user-12
content: 应该不关buf是否初始化的事，以下是我的机器运行结果—— #include "stdio.h" #include "string.h" #include "windows.h" FILE *sp;  char *p = "123"; void main() {     char buf[100]; 	if( (sp = fopen("1.txt","r")) == NULL) 		exit(1);  	while( fgets(buf,100,sp) != NULL ) 		printf("buf = %d\n",strlen(buf));  	printf("p = %d\n",strlen(p)); 	fclose(sp); 	scanf("%c",&buf[2]); } 以上是源代码，运行结果都是3，跟楼主的不一样，buf不是4【我的记事本里也只有“123”这些内容】

user: user-11
content: 再看看你的代码，还存在一个问题，你的buf没有初始化，直接读3个字节之后，buf[3]不见得是0，所以你的strlen(buf)是个危险的家伙

user: user-11
content: 这个要看你的文件是怎么存的吧，有些程序可能存一个文件结束符在后头，你可以断点看都出来的内容啊，再不济在文件夹里直接看这个文件有多少个字节总会吧